Commit e441a8db authored by 鲁鑫's avatar 鲁鑫

MES质量评审功能

parent 61e13dad
......@@ -29,4 +29,8 @@ DROP COLUMN `measure_date`,
DROP COLUMN `review_comments`;
ALTER TABLE `topsun`.`mes_unqualified_materials`
ADD COLUMN `result` varchar(10) NULL COMMENT '评审结果' AFTER `msg`;
\ No newline at end of file
ADD COLUMN `result` varchar(10) NULL COMMENT '评审结果' AFTER `msg`;
ALTER TABLE `topsun_dev`.`mes_unqualified_materials_item`
ADD COLUMN `explain` varchar(255) NULL COMMENT '说明' AFTER `version`;
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8" language="java"%>
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="x"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<x:base include="dialog,combox,attachment" />
<div class="container-fluid" style="padding: 10px;">
<form class="hg-form" method="post" action="" id="submitForm">
<x:hidden name="bizId" />
<x:fileList id="fileList" bizCode="unqualifiedMaterials" title="附件" bizId="bizId" />
</form>
</div>
$(document).ready(function () {
initialize();
bindEvent();
});
function initialize(){
UICtrl.layout("#layout", {leftWidth: 3});
$('#fileList').fileList({bizId:$("#id").val()});
}
function bindEvent(){
// $("#result").combox({onChange:function(data){
// var handleOpinion = $("#handleOpinion").val();
// $("#handleOpinion").val(data.text + "-" + handleOpinion)
// }
// })
}
function getExtendedData(processAction) {
var handleResult = getHandleResult();
//回退、打回、转交时,不需要验证必填项是否已经填写;
if (processAction == ProcessAction.BACK
|| processAction == ProcessAction.REPLENISH
|| processAction == ProcessAction.TRANSMIT || "2" == handleResult) {
//不验证
$('#submitForm').attr('check', false);
}
return true;
}
function checkConstraints(){
var handleOpinion = $("#handleOpinion").val();
$("#handleOpinion").val($("#result_text").val() + "-" + handleOpinion)
return true;
}
/**
* 流程引擎回调设置打样的id
* @param value
*/
function setId(id) {
$("#id").val(id);
}
/**
* 流程引擎获取打样申请id的回掉方法。
* @return
*/
function getId() {
return $("#id").val() || "";
}
//UICtrl中校验是否允许编辑
function businessJudgmentUnit() {
var isApply = isApplyProcUnit();
let approveProcUnit = isApproveProcUnit();
if (isApply) {
UICtrl.setElHideOrShow("#result",true)
return true;
}else {
UICtrl.setDisable($("#submitForm"));
}
if (approveProcUnit){
UICtrl.enable($("#result"));
UICtrl.setElRequiredFlag("#result",true);
}
return true;
}
function print(){
if ($("#statusId").val() != 3){
Public.tip("请审批完成再打印!");
return;
}
var url='/epChangeForm/print.load';
Public.openPostWindow(web_app.name+url,{id :$("#id").val()});
}
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@taglib uri="/WEB-INF/taglib.tld" prefix="x" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<x:base include="layout,dialog,grid,tree,dateTime,combox,attachment,commonTree,comboDialog"/>
<x:script src='/biz/topsun/mes/unqualifiedMaterials/unqualifiedMaterialsDetail.js'/>
</head>
<body>
<div class="container-fluid">
<x:billTitle title="质量异常评审表" needStatus="false" needPerson="true"/>
<form class="hg-form" method="post" action="" id="submitForm">
<x:hidden name="id"/>
<x:hidden name="billCode"/>
<x:hidden name="fillinDate" type="datetime"/>
<x:hidden name="fullId"/>
<x:hidden name="organId"/>
<x:hidden name="organName"/>
<x:hidden name="deptId"/>
<x:hidden name="deptName"/>
<x:hidden name="positionId"/>
<x:hidden name="positionName"/>
<x:hidden name="personMemberId"/>
<x:hidden name="personMemberName"/>
<x:hidden name="statusId"/>
<div class="hg-form-cols">
<div class="hg-form-row">
<x:inputC name="mblnr" required="false" readonly="true" label="物料凭证号" labelCol="2" fieldCol="2"/>
<x:inputC name="zeile" required="false" readonly="true" label="凭证项次" labelCol="2" fieldCol="2"/>
<x:inputC name="mjahr" required="false" readonly="true" label="凭证年份" labelCol="2" fieldCol="2"/>
</div>
<div class="hg-form-row">
<x:inputC name="productName" required="false" readonly="true" label="产品名称" labelCol="2" fieldCol="2"/>
<x:inputC name="type" required="false" readonly="true" label="类别" labelCol="2" fieldCol="2"/>
<x:inputC name="batchNo" required="false" readonly="true" label="生产批次" labelCol="2" fieldCol="2"/>
</div>
<div class="hg-form-row">
<x:inputC name="pd" required="false" readonly="true" label="PD/YL编码" labelCol="2" fieldCol="2"/>
<x:inputC name="process" required="false" readonly="true" label="部门/工序" labelCol="2" maxLength="64" fieldCol="2"/>
<x:inputC name="exceptionNum" required="false" readonly="true" label="异常数量" labelCol="2" maxLength="64" fieldCol="2"/>
</div>
<div class="hg-form-row">
<x:textareaC name="exceptionDesc" required="false" label="异常描述" labelCol="2" fieldCol="10" rows="3" readonly="true"/>
</div>
<div class="hg-form-row">
<x:hidden name="dutyDept"/>
<x:inputC name="dutyDeptName" required="false" readonly="true" label="责任部门" labelCol="2" fieldCol="2" />
<x:hidden name="submitter"/>
<x:inputC name="submitterName" required="false" readonly="true" label="提报人" labelCol="2" fieldCol="2" />
</div>
<div class="hg-form-row">
<x:selectC name="result" required="false" label="评审结果" labelCol="2" fieldCol="2" dictionary="result"/>
</div>
</div>
<div style="padding-top: 15px;">
<x:fileList bizCode="unqualifiedMaterials" bizId="id" id="fileList" title="相关资料" />
</div>
</form>
</div>
</body>
</html>
var gridManager = null;
$(document).ready(function () {
initUI();
loadGrid();
})
function initUI() {
UICtrl.initDefaultLayout();
}
function loadGrid() {
var toolbarOptions = UICtrl.getDefaultToolbarOptions({
addHandler: addHandler,
uploadFileHandler: {
id: 'uploadFileHandler', text: '上传附件', img:'fa-clipboard', click: function(){
uploadFile();
}
},
});
gridManager = UICtrl.grid("#maingrid", {
columns: [
{display: "单据编号", name: "billCode", width: 150, minWidth: 60, type: "string", align: "left"},
{display: "创建日期", name: "fillinDate", width: 120, minWidth: 60, type: "date", align: "left"},
{display: "申请人", name: "personMemberName", width: 120, minWidth: 60, type: "string", align: "left"},
{display: "申请部门", name: "deptName", width: 120, minWidth: 60, type: "string", align: "left"},
{display: "产品代号", name: "pd", width: 200, minWidth: 60, type: "string", align: "left"},
{display: "产品名称", name: "productName", width: 200, minWidth: 60, type: "string", align: "left"},
{display: "审批状态", name: "statusTextView", width: 100, minWidth: 60, type: "string", align: "left"},
{display: "状态码", name: "code", width: 100, minWidth: 60, type: "string", align: "left"},
{display: "消息", name: "msg", width: 300, minWidth: 60, type: "string", align: "left"},
],
dataAction: "server",
url: web_app.name + '/unqualifiedMaterials/slicedUnqualifiedMaterialsList.ajax',
pageSize: 20,
usePager: true,
toolbar: toolbarOptions,
width: "100%",
height: "100%",
heightDiff: -8,
checkbox: true,
fixedCellHeight: true,
selectRowButtonOnly: true,
onDblClickRow: function (data, rowindex, rowobj) {
doView(data.id);
},
});
UICtrl.setSearchAreaToggle(gridManager);
}
function query(obj) {
var param = $(obj).formToJSON();
UICtrl.gridSearch(gridManager, param);
}
function reloadGrid() {
gridManager.loadData();
}
function resetForm(obj) {
$(obj).formClean();
}
function addHandler() {
UICtrl.addTabItem({
tabid: 'unqualifiedMaterials',
text: "新增质量异常评审表",
url: web_app.name + '/unqualifiedMaterials/forwardUnqualifiedMaterialsDetail.job'
});
}
function doView(id) {
UICtrl.addTabItem({
tabid: 'unqualifiedMaterials'+id,
text: "查看质量异常评审表",
url: web_app.name + '/unqualifiedMaterials/showUnqualifiedMaterialsDetail.job?bizId='+id+"&isReadOnly=true"
});
}
function uploadFile(){
var row = gridManager.getSelectedRow();
UICtrl.showAjaxDialog({
title: $.i18nProp('相关附件'),
width: 600,
url: web_app.name + '/unqualifiedMaterials/uploadFile.load?id='+row.id,
init: function (div) {
$('#fileList').fileList({bizId:row.id});
},
okVal: 'common.button.ok',
ok: function (div) {
}
});
}
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8" language="java" %>
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="x" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<x:base include="layout,dialog,grid,tree,combox,commonTree"/>
<x:script src='/biz/topsun/mes/unqualifiedMaterials/unqualifiedMaterialsList.js'/>
</head>
<body>
<div class="container-fluid">
<div class="ui-hide">
</div>
<div id="layout">
<div position="center" title="质量异常评审表">
<x:title title="common.button.search" hideTable="queryMainForm" isHide="true"/>
<form class="hg-form ui-hide" method="post" action="" id="queryMainForm">
<x:inputC name="billCode" required="false" label="申请单号" labelCol="1"/>
<x:searchButtons/>
</form>
<div class="blank_div clearfix"></div>
<div id="maingrid" style="margin: 2px;"></div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
package com.huigou.topsun.mes.unqualifiedMaterials.application;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterials;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.query.UnqualifiedMaterialsQueryRequest;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.vo.UnqualifiedMaterialsVo;
import java.util.Map;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:29
* @Description:
*/
public interface UnqualifiedMaterialsApplication {
public static final String QUERY_XML_FILE_PATH = "config/topsun/mes/unqualifiedMaterials/unqualifiedMaterials.xml";
String PROCESS_DEFINITION_KEY = "unqualifiedMaterialsProc";
UnqualifiedMaterials findUnqualifiedMaterialsById(String id);
UnqualifiedMaterials saveUnqualifiedMaterials(UnqualifiedMaterials unqualifiedMaterials);
Map<String, Object> slicedUnqualifiedMaterialsList(UnqualifiedMaterialsQueryRequest queryRequest);
void saveMesUnqualifiedMaterialsVo(UnqualifiedMaterialsVo unqualifiedMaterialsVo);
}
package com.huigou.topsun.mes.unqualifiedMaterials.application.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huigou.context.Operator;
import com.huigou.context.OrgUnit;
import com.huigou.context.ThreadLocalUtil;
import com.huigou.data.domain.model.CommonDomainConstants;
import com.huigou.data.query.model.QueryDescriptor;
import com.huigou.data.query.model.QueryModel;
import com.huigou.topsun.mes.unqualifiedMaterials.application.UnqualifiedMaterialsApplication;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterials;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterialsItem;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.query.UnqualifiedMaterialsQueryRequest;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.vo.UnqualifiedMaterialsFeedBack;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.vo.UnqualifiedMaterialsVo;
import com.huigou.topsun.mes.unqualifiedMaterials.repository.UnqualifiedMaterialsItemRepository;
import com.huigou.topsun.mes.unqualifiedMaterials.repository.UnqualifiedMaterialsRepository;
import com.huigou.topsun.sap.common.HttpClient;
import com.huigou.topsun.sap.common.application.SapMutualEpLogApplication;
import com.huigou.topsun.sap.common.domain.MesResult;
import com.huigou.uasp.bmp.common.BizBillStatus;
import com.huigou.uasp.bmp.operator.OperatorApplication;
import com.huigou.uasp.bmp.opm.domain.model.org.Org;
import com.huigou.uasp.bpm.FlowBroker;
import com.huigou.uasp.bpm.ProcessAction;
import com.huigou.uasp.bpm.ProcessStartModel;
import com.huigou.uasp.bpm.engine.application.WorkflowApplication;
import com.huigou.uasp.bpm.engine.domain.model.ProcUnitHandler;
import com.huigou.uasp.bpm.engine.domain.model.TaskExtension;
import com.huigou.util.*;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.io.IOException;
import java.util.*;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:29
* @Description:
*/
@Service("unqualifiedMaterialsApplication")
public class UnqualifiedMaterialsApplicationImpl extends FlowBroker implements UnqualifiedMaterialsApplication {
@Autowired
private UnqualifiedMaterialsRepository unqualifiedMaterialsRepository;
@Autowired
private WorkflowApplication workflowApplication;
@Autowired
private OperatorApplication operatorApplication;
@Autowired
private HttpClient httpClient;
@Autowired
SapMutualEpLogApplication sapMutualEpLogApplication;
@Autowired
private UnqualifiedMaterialsItemRepository unqualifiedMaterialsItemRepository;
@Override
protected String saveBizAndApprovalData() {
super.saveBizAndApprovalData();
UnqualifiedMaterials unqualifiedMaterials = getBizEntity(UnqualifiedMaterials.class);
if (unqualifiedMaterials.isNew()) {
unqualifiedMaterials.setStatusId(BizBillStatus.APPLYING.getId());
} else {
unqualifiedMaterials = (UnqualifiedMaterials) commonDomainService.loadAndFillinProperties(unqualifiedMaterials);
}
unqualifiedMaterials = unqualifiedMaterialsRepository.save(unqualifiedMaterials);
return unqualifiedMaterials.getId();
}
@Override
protected Map<String, Object> getProcessBizParams(String bizId) {
// 返回业务数据给流程实例,
return ClassHelper.toMap(unqualifiedMaterialsRepository.getOne(bizId));
}
/**
* 流程撤销事件
**/
@Override
protected void onRecallProcessInstance(DelegateExecution delegateExecution) {
String bizId = delegateExecution.getProcessBusinessKey();
// 修改单据状态为申请
updateStatus(bizId, BizBillStatus.APPLYING);
}
/**
* 任务完成前执行
*/
@Override
protected void onBeforeComplete(DelegateTask delegateTask) {
super.onBeforeComplete(delegateTask);
String bizId = delegateTask.getExecution().getProcessBusinessKey();
UnqualifiedMaterials unqualifiedMaterials = this.unqualifiedMaterialsRepository.findOne(bizId);
if (this.isApplyProcUnit(delegateTask) && this.getApprovalParameter().isAdvanceProcessAction()) {
updateStatus(bizId, BizBillStatus.APPROVING);
}
if (this.isApprovalProcUnit(delegateTask) && this.getApprovalParameter().isAdvanceProcessAction()){
TaskExtension te = actApplication.loadRuntimeTaskExtension(delegateTask.getId());
cn.hutool.core.lang.Assert.notNull(te, String.format("未查询到流程任务【%s】的扩展信息", delegateTask.getId()));
// 获取流程任务对应的审批环节信息
ProcUnitHandler procUnitHandler = procUnitHandlerApplication.loadProcUnitHandler(te.getProcUnitHandlerId());
String subProcUnitName = procUnitHandler.getSubProcUnitName();
//把本次节点的审批结果记录下来
UnqualifiedMaterialsItem materialsItem = unqualifiedMaterialsItemRepository.findByUnqualifiedMaterialsIdAndDept(bizId, subProcUnitName);
//如果之前审批过,填写了意见,打回或者回退后再次审批时,覆盖之前的意见
if (Objects.isNull(materialsItem)){
UnqualifiedMaterialsItem unqualifiedMaterialsItem = new UnqualifiedMaterialsItem();
unqualifiedMaterialsItem.setUnqualifiedMaterialsId(bizId);
unqualifiedMaterialsItem.setDept(subProcUnitName);
unqualifiedMaterialsItem.setResult(unqualifiedMaterials.getResult());
unqualifiedMaterialsItem.setOpinion(procUnitHandler.getOpinion());
unqualifiedMaterialsItemRepository.save(unqualifiedMaterialsItem);
}else {
materialsItem.setOpinion(procUnitHandler.getOpinion());
materialsItem.setResult(unqualifiedMaterials.getResult());
unqualifiedMaterialsItemRepository.save(materialsItem);
}
//清空,下次赋值
//unqualifiedMaterials.setResult(null);
this.unqualifiedMaterialsRepository.save(unqualifiedMaterials);
}
}
/**
* 回收事件
**/
@Override
protected void onWithdraw(DelegateTask delegateTask, String destActivityId) {
super.onWithdraw(delegateTask, destActivityId);
String bizId = delegateTask.getExecution().getProcessBusinessKey();
if (destActivityId.equalsIgnoreCase("apply")) {
updateStatus(bizId, BizBillStatus.APPLYING);
}
}
@Transactional
private void updateStatus(String bizId, BizBillStatus status) {
Assert.hasText(bizId, CommonDomainConstants.ID_NOT_BLANK);
this.commonDomainService.updateStatus(UnqualifiedMaterials.class, bizId, status.getId());
}
@Override
protected void onEnd(DelegateExecution delegateExecution) {
super.onEnd(delegateExecution);
String bizId = delegateExecution.getProcessBusinessKey();
BizBillStatus status = approvePassed() ? BizBillStatus.COMPLETED : BizBillStatus.ABORTED;
UnqualifiedMaterials unqualifiedMaterials = unqualifiedMaterialsRepository.findOne(bizId);
unqualifiedMaterials.setStatusId(status.getId());
//发送审批结果到MES
this.feedBackSaleOrder(unqualifiedMaterials);
}
public void feedBackSaleOrder(UnqualifiedMaterials unqualifiedMaterials){
//日志记录
Map<String, Object> resultMap = new HashMap<>();
UnqualifiedMaterialsFeedBack unqualifiedMaterialsFeedBack = new UnqualifiedMaterialsFeedBack();
ClassHelper.copyProperties(unqualifiedMaterials,unqualifiedMaterialsFeedBack);
unqualifiedMaterialsFeedBack.setActionType("checkIqcResult");
try {
String execute = httpClient.executeForEp(unqualifiedMaterialsFeedBack, "v1/iqc/bpmapi");
MesResult mesResult = JSONObject.parseObject(execute, MesResult.class);
resultMap.put("TYPE", mesResult.getCode());
resultMap.put("message", mesResult.getMsg());
if (!"200".equals(mesResult.getCode())){
throw new RuntimeException("数据传输失败,"+ mesResult.getMsg());
}
unqualifiedMaterials.setCode(mesResult.getCode());
unqualifiedMaterials.setMsg(mesResult.getMsg());
unqualifiedMaterialsRepository.save(unqualifiedMaterials);
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
resultMap.put("businessType", "IQC");
resultMap.put("businessId", unqualifiedMaterials.getBillCode());
resultMap.put("parameter", JSON.toJSONString(resultMap));
resultMap.put("sequence", resultMap.get("row"));
sapMutualEpLogApplication.saveSapMutualEpLog(resultMap);
}
}
@Override
protected void onAbortProcessInstance(DelegateExecution delegateExecution) {
super.onAbortProcessInstance(delegateExecution);
String bizId = delegateExecution.getProcessBusinessKey();
UnqualifiedMaterials unqualifiedMaterials = unqualifiedMaterialsRepository.findOne(bizId);
unqualifiedMaterials.setStatusId(BizBillStatus.ABORTED.getId());
unqualifiedMaterialsRepository.save(unqualifiedMaterials);
}
/**
* @param delegateTask
* @param destActivityId 回退到的目标节点id
*/
@Override
protected void onBack(DelegateTask delegateTask, String destActivityId) {
super.onBack(delegateTask, destActivityId);
if ("Apply".equalsIgnoreCase(destActivityId)) {
String bizId = delegateTask.getExecution().getProcessBusinessKey();
UnqualifiedMaterials unqualifiedMaterials = unqualifiedMaterialsRepository.findOne(bizId);
unqualifiedMaterials.setStatusId(BizBillStatus.APPLYING.getId());
unqualifiedMaterialsRepository.save(unqualifiedMaterials);
}
}
/**
* 设置任务名称
*/
@Override
protected void setTaskDescription(DelegateTask delegateTask) {
String bizId = delegateTask.getExecution().getProcessBusinessKey();
delegateTask.setDescription(this.getApprovalSubjectName(bizId));
}
/**
* 获取任务标题
*
* @param bizId
* @return
*/
private String getApprovalSubjectName(String bizId) {
UnqualifiedMaterials unqualifiedMaterials = this.unqualifiedMaterialsRepository.findOne(bizId);
//查询 单据日期
String fillinDateStr = DateUtil.getDateFormat("yyyy-MM-dd HH:mm:ss", unqualifiedMaterials.getFillinDate());
//设置标题
return String.format("%s-%s(%s)", "质量异常评审表", unqualifiedMaterials.getBillCode(), fillinDateStr);
}
@Override
public UnqualifiedMaterials findUnqualifiedMaterialsById(String id) {
return unqualifiedMaterialsRepository.findOne(id);
}
@Override
public UnqualifiedMaterials saveUnqualifiedMaterials(UnqualifiedMaterials unqualifiedMaterials) {
return unqualifiedMaterialsRepository.save(unqualifiedMaterials);
}
@Override
public Map<String, Object> slicedUnqualifiedMaterialsList(UnqualifiedMaterialsQueryRequest queryRequest) {
QueryDescriptor queryDescriptor = this.sqlExecutorDao.getQuery(QUERY_XML_FILE_PATH, "unqualifiedMaterials");
QueryModel queryModel = this.sqlExecutorDao.getQueryModel(queryDescriptor, queryRequest);
queryModel.putDictionary("status", BizBillStatus.getMap());
Map<String, Object> map = this.sqlExecutorDao.executeSlicedQuery(queryModel);
return map;
}
@Override
public void saveMesUnqualifiedMaterialsVo(UnqualifiedMaterialsVo unqualifiedMaterialsVo) {
UnqualifiedMaterials unqualifiedMaterials = new UnqualifiedMaterials();
BeanUtil.copyProperties(unqualifiedMaterialsVo,unqualifiedMaterials);
//初始化用户信息
String personCode = unqualifiedMaterialsVo.getSubmitter();
QueryDescriptor queryDescriptor = this.sqlExecutorDao.getQuery("config/topsun/ep/epSaleOrder/epSaleOrder.xml", "loadPersonMemberId");
String personMemberId = this.sqlExecutorDao.queryToString(queryDescriptor.getSql(), personCode);
if (StringUtil.isBlank(personMemberId)){
throw new RuntimeException("未找到编码为:" + personCode + " 的人员");
}
Operator operator = operatorApplication.createOperatorByPersonMemberId(personMemberId);
SDO localSdo = new SDO();
localSdo.setOperator(operator);
unqualifiedMaterials.setDefaultValues(new OrgUnit(operator.getFullId(), operator.getFullName()));
Map<String, Object> formData = BeanUtil.beanToMap(unqualifiedMaterials);
this.startProcessInstance(UnqualifiedMaterialsApplication.PROCESS_DEFINITION_KEY, formData, localSdo);
}
public String startProcessInstance(String processDefinitionKey,Map<String, Object> formData, SDO localSdo){
Map<String, Object> variables = new HashMap();
// 将业务数据传递给工作流
formData.forEach(localSdo::putProperty);
// 将业务流程信息传递给工作流
localSdo.putProperty("processAction", ProcessAction.SAVE);
localSdo.putProperty("procUnitId", "Apply");
ThreadLocalUtil.putVariable(Constants.SDO, localSdo);
variables.put("startModel", ProcessStartModel.MANUAL.getId());
Operator operator = localSdo.getOperator();
variables.put("executorFullId", operator.getFullId());
variables.put("executorFullName", operator.getFullName());
ThreadLocalUtil.putOperator(operator);
ThreadLocalUtil.putVariable("client.ip", "127.0.0.1");
ProcessInstance processInstance = this.workflowApplication.startProcessInstanceByKey(processDefinitionKey, variables);
String businessKey = processInstance.getBusinessKey();
return businessKey;
}
}
package com.huigou.topsun.mes.unqualifiedMaterials.controller;
import com.huigou.context.Operator;
import com.huigou.context.OrgUnit;
import com.huigou.topsun.mes.unqualifiedMaterials.application.UnqualifiedMaterialsApplication;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterials;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.query.UnqualifiedMaterialsQueryRequest;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.vo.UnqualifiedMaterialsVo;
import com.huigou.uasp.annotation.ControllerMapping;
import com.huigou.uasp.annotation.SkipAuth;
import com.huigou.uasp.bmp.common.BizBillStatus;
import com.huigou.uasp.client.CommonController;
import com.huigou.util.JSONUtil;
import com.huigou.util.SDO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:30
* @Description:
*/
@Controller
@ControllerMapping("/unqualifiedMaterials")
public class UnqualifiedMaterialsController extends CommonController {
private final static Logger LOG = LoggerFactory.getLogger(UnqualifiedMaterialsController.class);
@Autowired
private UnqualifiedMaterialsApplication unqualifiedMaterialsApplication;
@Override
protected String getPagePath() {
return "/biz/topsun/mes/unqualifiedMaterials/";
}
public String forwardUnqualifiedMaterialsList(){
return forward("unqualifiedMaterialsList");
}
@SkipAuth
@RequestMapping( value = "/getMesUnqualifiedMaterials")
@ResponseBody
public HashMap<String, Object> getMesUnqualifiedMaterials(@RequestBody UnqualifiedMaterialsVo unqualifiedMaterialsVo){
//SDO sdo = this.getSDO();
HashMap<String, Object> messageMap = new HashMap<>();
messageMap.put("Message_Status","S");
messageMap.put("Message_Text","成功");
LOG.info("MES质量异常评审表审批数据=={}", JSONUtil.toString(unqualifiedMaterialsVo));
try {
this.unqualifiedMaterialsApplication.saveMesUnqualifiedMaterialsVo(unqualifiedMaterialsVo);
}catch (RuntimeException e){
messageMap.put("Message_Status","E");
messageMap.put("Message_Text",e.getMessage());
}
return messageMap;
}
public String slicedUnqualifiedMaterialsList(){
SDO sdo = this.getSDO();
UnqualifiedMaterialsQueryRequest queryRequest = sdo.toQueryRequest(UnqualifiedMaterialsQueryRequest.class);
Map<String, Object> map = unqualifiedMaterialsApplication.slicedUnqualifiedMaterialsList(queryRequest);
return toResult(map);
}
public String forwardUnqualifiedMaterialsDetail(){
this.putAttribute("processDefinitionKey", UnqualifiedMaterialsApplication.PROCESS_DEFINITION_KEY);
// 新增的时候procUnitId一定要设置成Apply,不然jsp页面的所有表单元素是readonly状态
this.putAttribute("procUnitId", "Apply");
UnqualifiedMaterials unqualifiedMaterials = new UnqualifiedMaterials();
unqualifiedMaterials.setStatusId(BizBillStatus.APPLYING.getId());
/**
* 设置jsp页面初始化填充数据,如果不设置, 那么在jsp页面上填写完表单之后立即提交申请TaskDescription获取不到时间和相关人员信息
*/
Operator operator = getOperator();
unqualifiedMaterials.setDefaultValues(new OrgUnit(operator.getFullId(), operator.getFullName()));
return forward("unqualifiedMaterialsDetail",unqualifiedMaterials);
}
public String showUnqualifiedMaterialsDetail(){
SDO sdo = this.getSDO();
String id = sdo.getBizId();
UnqualifiedMaterials unqualifiedMaterials = unqualifiedMaterialsApplication.findUnqualifiedMaterialsById(id);
return forward("unqualifiedMaterialsDetail",unqualifiedMaterials);
}
public String uploadFile(){
SDO sdo = this.getSDO();
String id = sdo.getId();
this.putAttribute("bizId",id);
return forward("attachment");
}
}
package com.huigou.topsun.mes.unqualifiedMaterials.domain;
import com.huigou.data.domain.model.FlowBillAbstractEntity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:25
* @Description: 质量异常评审表
*/
@Entity
@Data
@Table(name = "mes_unqualified_materials")
public class UnqualifiedMaterials extends FlowBillAbstractEntity {
/**
* 物料凭证号
*/
@Column(name = "MBLNR")
private String mblnr;
/**
* 凭证项次
*/
@Column(name = "ZEILE")
private String zeile;
/**
* 凭证年份
*/
@Column(name = "MJAHR")
private String mjahr;
/**
* 产品名称
*/
@Column(name = "product_name")
private String productName;
/**
* 类别
*/
@Column(name = "type")
private String type;
/**
* 生产批次
*/
@Column(name = "batch_no")
private String batchNo;
/**
* PD/YL编码
*/
@Column(name = "pd")
private String pd;
/**
* 部门/工序
*/
@Column(name = "process")
private String process;
/**
* 异常数量
*/
@Column(name = "exception_num")
private BigDecimal exceptionNum;
/**
* 异常描述
*/
@Column(name = "exception_desc")
private String exceptionDesc;
/**
* 责任部门
*/
@Column(name = "duty_dept")
private String dutyDept;
/**
* 责任部门
*/
@Column(name = "duty_dept_name")
private String dutyDeptName;
/**
* 提报人
*/
@Column(name = "submitter")
private String submitter;
/**
* 提报人
*/
@Column(name = "submitter_name")
private String submitterName;
/**
* 处理结果
*/
@Column(name = "result")
private String result;
/**
* MES返回状态码
*/
@Column(name = "code")
private String code;
/**
* MES返回消息
*/
@Column(name = "msg")
private String msg;
@Override
protected String getCodeRuleId() {
return "unqualifiedMaterials";
}
}
package com.huigou.topsun.mes.unqualifiedMaterials.domain;
import com.huigou.data.domain.model.AbstractEntity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @Auther: xin.lu
* @Date: 2024/08/28/14:38
* @Description: 质量异常评审表明细
*/
@Entity
@Data
@Table(name = "mes_unqualified_materials_item")
public class UnqualifiedMaterialsItem extends AbstractEntity {
@Column(name = "unqualified_materials_id")
private String unqualifiedMaterialsId;
@Column(name = "dept")
private String dept;
@Column(name = "result")
private String result;
@Column(name = "opinion")
private String opinion;
}
package com.huigou.topsun.mes.unqualifiedMaterials.domain.query;
import com.huigou.data.domain.query.QueryAbstractRequest;
import lombok.Data;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:26
* @Description:
*/
@Data
public class UnqualifiedMaterialsQueryRequest extends QueryAbstractRequest {
private String billCode;
}
package com.huigou.topsun.mes.unqualifiedMaterials.domain.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Auther: xin.lu
* @Date: 2024/08/27/17:16
* @Description:
*/
@Data
public class UnqualifiedMaterialsFeedBack implements Serializable {
/**
* 物料凭证号
*/
@JsonProperty("MBLNR")
private String mblnr;
/**
* 凭证项次
*/
@JsonProperty("ZEILE")
private String zeile;
/**
* 凭证年份
*/
@JsonProperty("MJAHR")
private String mjahr;
/**
* 固定值:checkIqcResult
*/
@JsonProperty("actionType")
private String actionType;
/**
* ng/pass/back/sort
*/
@JsonProperty("result")
private String result;
}
package com.huigou.topsun.mes.unqualifiedMaterials.domain.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.huigou.data.domain.model.FlowBillAbstractEntity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:25
* @Description: 质量异常评审表
*/
@Data
public class UnqualifiedMaterialsVo implements Serializable {
/**
* 物料凭证号
*/
@JsonProperty("MBLNR")
private String mblnr;
/**
* 凭证项次
*/
@JsonProperty("ZEILE")
private String zeile;
/**
* 凭证年份
*/
@JsonProperty("MJAHR")
private String mjahr;
/**
* 产品名称
*/
@JsonProperty("productName")
private String productName;
/**
* 类别
*/
@JsonProperty("type")
private String type;
/**
* 生产批次
*/
@JsonProperty("batchNo")
private String batchNo;
/**
* PD/YL编码
*/
@JsonProperty("pd")
private String pd;
/**
* 部门/工序
*/
@JsonProperty("process")
private String process;
/**
* 异常数量
*/
@JsonProperty("exceptionNum")
private BigDecimal exceptionNum;
/**
* 异常描述
*/
@JsonProperty("exceptionDesc")
private String exceptionDesc;
/**
* 责任部门
*/
@JsonProperty("dutyDept")
private String dutyDept;
/**
* 责任部门
*/
@JsonProperty("dutyDeptName")
private String dutyDeptName;
/**
* 提报人
*/
@JsonProperty("submitter")
private String submitter;
/**
* 提报人
*/
@JsonProperty("submitterName")
private String submitterName;
}
package com.huigou.topsun.mes.unqualifiedMaterials.repository;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterialsItem;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @Auther: xin.lu
* @Date: 2024/08/28/14:41
* @Description:
*/
public interface UnqualifiedMaterialsItemRepository extends JpaRepository<UnqualifiedMaterialsItem,String> {
UnqualifiedMaterialsItem findByUnqualifiedMaterialsIdAndDept(String unqualifiedMaterialsId,String dept);
List<UnqualifiedMaterialsItem> findByUnqualifiedMaterialsId(String unqualifiedMaterialsId);
}
package com.huigou.topsun.mes.unqualifiedMaterials.repository;
import com.huigou.topsun.mes.unqualifiedMaterials.domain.UnqualifiedMaterials;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @Auther: xin.lu
* @Date: 2024/08/12/10:29
* @Description:
*/
public interface UnqualifiedMaterialsRepository extends JpaRepository<UnqualifiedMaterials,String> {
}
package com.huigou.topsun.sap.common.domain;
import lombok.Data;
import java.io.Serializable;
/**
* @Auther: xin.lu
* @Date: 2024/03/16/10:06
* @Description:
*/
@Data
public class MesResult implements Serializable {
private String code;
private String msg;
private EpResultValue data;
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="unqualifiedMaterialsProc" name="质量异常评审表" isExecutable="true">
<extensionElements>
<activiti:executionListener event="start" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:executionListener>
<activiti:executionListener event="end" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:executionListener>
</extensionElements>
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="Apply" name="质量异常评审表" activiti:formKey="unqualifiedMaterials/showUnqualifiedMaterialsDetail.job">
<extensionElements>
<activiti:taskListener event="all" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:taskListener>
<activiti:taskListener event="saveBizData" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:taskListener>
</extensionElements>
</userTask>
<userTask id="Approve" name="质量异常评审表审批" activiti:assignee="${assignee} " activiti:formKey="unqualifiedMaterials/showUnqualifiedMaterialsDetail.job">
<extensionElements>
<activiti:taskListener event="all" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:taskListener>
<activiti:taskListener event="saveBizData" delegateExpression="#{unqualifiedMaterialsApplication}"></activiti:taskListener>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="handlerList" activiti:elementVariable="assignee">
<completionCondition>${chiefApprovePassed}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="Apply"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="Apply" targetRef="Approve"></sequenceFlow>
<exclusiveGateway id="ApproveFinished" name="审批结束"></exclusiveGateway>
<sequenceFlow id="flow3" name="审批通过" sourceRef="ApprovePassed" targetRef="ApproveFinished">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${approvePassed}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" name="审批结束" sourceRef="ApproveFinished" targetRef="endevent1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${approveFinished}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow5" name="审批未结束" sourceRef="ApproveFinished" targetRef="Approve">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approveFinished}]]></conditionExpression>
</sequenceFlow>
<exclusiveGateway id="ApprovePassed" name="审批通过"></exclusiveGateway>
<sequenceFlow id="flow6" sourceRef="Approve" targetRef="ApprovePassed"></sequenceFlow>
<sequenceFlow id="flow9" name="审批未通过" sourceRef="ApprovePassed" targetRef="Apply">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approvePassed}]]></conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_unqualifiedMaterialsProc">
<bpmndi:BPMNPlane bpmnElement="unqualifiedMaterialsProc" id="BPMNPlane_unqualifiedMaterialsProc">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="355.0" y="50.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="355.0" y="550.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Apply" id="BPMNShape_Apply">
<omgdc:Bounds height="55.0" width="161.0" x="292.0" y="140.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Approve" id="BPMNShape_Approve">
<omgdc:Bounds height="55.0" width="161.0" x="292.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="ApproveFinished" id="BPMNShape_ApproveFinished">
<omgdc:Bounds height="40.0" width="40.0" x="352.0" y="440.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="ApprovePassed" id="BPMNShape_ApprovePassed">
<omgdc:Bounds height="40.0" width="40.0" x="352.0" y="349.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="372.0" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="372.0" y="140.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="372.0" y="195.0"></omgdi:waypoint>
<omgdi:waypoint x="372.0" y="240.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="372.0" y="389.0"></omgdi:waypoint>
<omgdi:waypoint x="372.0" y="440.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="48.0" x="320.0" y="396.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="372.0" y="480.0"></omgdi:waypoint>
<omgdi:waypoint x="372.0" y="550.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="48.0" x="382.0" y="489.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="392.0" y="460.0"></omgdi:waypoint>
<omgdi:waypoint x="519.0" y="459.0"></omgdi:waypoint>
<omgdi:waypoint x="519.0" y="317.0"></omgdi:waypoint>
<omgdi:waypoint x="519.0" y="267.0"></omgdi:waypoint>
<omgdi:waypoint x="489.0" y="267.0"></omgdi:waypoint>
<omgdi:waypoint x="453.0" y="267.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="60.0" x="459.0" y="411.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
<omgdi:waypoint x="372.0" y="295.0"></omgdi:waypoint>
<omgdi:waypoint x="372.0" y="349.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
<omgdi:waypoint x="352.0" y="369.0"></omgdi:waypoint>
<omgdi:waypoint x="231.0" y="369.0"></omgdi:waypoint>
<omgdi:waypoint x="231.0" y="167.0"></omgdi:waypoint>
<omgdi:waypoint x="292.0" y="167.0"></omgdi:waypoint>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="14.0" width="60.0" x="257.0" y="376.0"></omgdc:Bounds>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<query-mappings>
<query name="unqualifiedMaterials" label="质量异常评审表" table="mes_unqualified_materials">
<sql-query>
select t.* from mes_unqualified_materials t
</sql-query>
<condition column="bill_code" name="billCode" type="java.lang.String" symbol="like" alias="t"/>
<condition column="id" name="id" type="java.lang.String" symbol="=" alias="t"/>
</query>
</query-mappings>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment