Browse Source

2026-06-09

Lab系统
master
fengyuan_yang 3 days ago
parent
commit
386c79a4b3
  1. 1
      src/main/java/com/spring/common/utils/Constant.java
  2. 237
      src/main/java/com/spring/modules/lab/controller/LabController.java
  3. 248
      src/main/java/com/spring/modules/lab/entity/LabEntity.java
  4. 24
      src/main/java/com/spring/modules/lab/mapper/LabMapper.java
  5. 47
      src/main/java/com/spring/modules/lab/service/LabService.java
  6. 411
      src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java
  7. 29
      src/main/java/com/spring/modules/lab/vo/LabSubmitVo.java
  8. 110
      src/main/resources/mapper/lab/LabMapper.xml

1
src/main/java/com/spring/common/utils/Constant.java

@ -49,6 +49,7 @@ public class Constant {
public static final String DY_PR = "PROOFING";
public static final String ECN = "ECN";
public static final String ROHS = "rohs";
public static final String LAB = "lab";
public static final String TOOL = "TOOL";
public static final String QUOTATION = "QUOTATION";
public static final String TEST = "TEST";

237
src/main/java/com/spring/modules/lab/controller/LabController.java

@ -0,0 +1,237 @@
package com.spring.modules.lab.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.spring.common.utils.PageUtils;
import com.spring.common.utils.R;
import com.spring.modules.base.service.TransNoControlService;
import com.spring.modules.change.vo.ProcessFormVo;
import com.spring.modules.lab.entity.LabEntity;
import com.spring.modules.lab.service.LabService;
import com.spring.modules.lab.vo.LabSubmitVo;
import com.spring.modules.oss.entity.SysOssEntity;
import com.spring.modules.oss.service.SysOssService;
import com.spring.modules.sys.entity.SysUserEntity;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Lab Controller
*/
@RestController
@RequestMapping("/lab")
public class LabController {
private static final String REFERENCE_NO_TRANS_TYPE = "reference_no";
@Autowired
private LabService labService;
@Autowired
private SysOssService sysOssService;
@Autowired
private TransNoControlService transNoControlService;
/**
* 列表查询
*/
@GetMapping("/list")
public R list(@RequestParam Map<String, Object> params) {
PageUtils page = labService.queryPage(params);
return R.ok().put("page", page);
}
/**
* 详情查询
*/
@GetMapping("/info")
public R info(@RequestParam("site") String site, @RequestParam("referenceNo") String referenceNo) {
if (StringUtils.isBlank(site) || StringUtils.isBlank(referenceNo)) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
LabEntity lab = labService.getDetail(site, referenceNo);
return R.ok().put("data", lab);
}
/**
* 保存
*/
@PostMapping("/save")
@Transactional
public R save(@RequestBody LabEntity lab) {
if (StringUtils.isBlank(lab.getSite()) || StringUtils.isBlank(lab.getReferenceNo())) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
String currentUserName = getCurrentUserName();
String originalReferenceNo = lab.getReferenceNo();
String newReferenceNo = originalReferenceNo;
if (originalReferenceNo.startsWith("TEMP-")) {
newReferenceNo = transNoControlService.transNo(lab.getSite(), REFERENCE_NO_TRANS_TYPE);
if (StringUtils.isBlank(newReferenceNo)) {
return R.error("请维护编码生成规则(TransNoControl)!");
}
lab.setReferenceNo(newReferenceNo);
SysOssEntity updateOss = new SysOssEntity();
updateOss.setOrderRef1(lab.getSite());
updateOss.setOrderRef2(newReferenceNo);
QueryWrapper<SysOssEntity> ossWrapper = new QueryWrapper<>();
ossWrapper.eq("order_ref1", lab.getSite());
ossWrapper.eq("order_ref2", originalReferenceNo);
sysOssService.update(updateOss, ossWrapper);
} else {
LabEntity exist = labService.getDetail(lab.getSite(), lab.getReferenceNo());
if (exist != null) {
return R.error("该序列号(referenceNo)的申请记录已存在");
}
}
if (lab.getApplicationDate() == null) {
lab.setApplicationDate(new Date());
}
if (StringUtils.isBlank(lab.getStatus())) {
lab.setStatus("草稿");
}
if (lab.getCreateDate() == null) {
lab.setCreateDate(new Date());
}
if (StringUtils.isBlank(lab.getCreateBy())) {
lab.setCreateBy(currentUserName);
}
if (lab.getStepId() == null) {
lab.setStepId(10);
}
if (StringUtils.isBlank(lab.getRejectFlag())) {
lab.setRejectFlag("N");
}
labService.save(lab);
return R.ok().put("referenceNo", newReferenceNo);
}
/**
* 修改
*/
@PostMapping("/update")
public R update(@RequestBody LabEntity lab) {
if (StringUtils.isBlank(lab.getSite()) || StringUtils.isBlank(lab.getReferenceNo())) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
String currentUserName = getCurrentUserName();
LabEntity exists = labService.getDetail(lab.getSite(), lab.getReferenceNo());
if (exists == null) {
return R.error("未找到对应Lab单据");
}
if ("已完成".equals(exists.getStatus())) {
return R.error("已完成状态的单据不允许修改");
}
if (StringUtils.isBlank(lab.getStatus())) {
lab.setStatus(exists.getStatus());
}
lab.setUpdateDate(new Date());
if (StringUtils.isBlank(lab.getUpdateBy())) {
lab.setUpdateBy(currentUserName);
}
QueryWrapper<LabEntity> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("site", lab.getSite()).eq("reference_no", lab.getReferenceNo());
labService.update(lab, updateWrapper);
return R.ok();
}
/**
* 下达
*/
@PostMapping("/issue")
public R issue(@RequestBody LabSubmitVo data) {
if (StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getReferenceNo()) || StringUtils.isBlank(data.getMenuId())) {
return R.error("工厂(site)、序列号(referenceNo)和菜单ID(menuId)不能为空");
}
try {
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
String userName = user == null ? null : user.getUsername();
labService.issue(data.getSite(), data.getReferenceNo(), userName, data.getMenuId());
} catch (RuntimeException e) {
return R.error(e.getMessage());
}
return R.ok();
}
/**
* 审批提交同意/驳回
*/
@PostMapping("/submit")
public R submit(@RequestBody LabSubmitVo data) {
if (StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getReferenceNo())) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
try {
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
String userName = user == null ? null : user.getUsername();
labService.submit(data, userName);
} catch (RuntimeException e) {
return R.error(e.getMessage());
}
return R.ok();
}
/**
* 查询审批信息
*/
@PostMapping("/approvalList")
public R approvalList(@RequestBody LabSubmitVo data) {
if (StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getMenuId()) || StringUtils.isBlank(data.getDocumentNo())) {
return R.ok().put("rows", Collections.emptyList());
}
List<ProcessFormVo> list = labService.getApprovalList(data.getSite(), data.getMenuId(), data.getDocumentNo());
return R.ok().put("rows", list);
}
/**
* 查询按钮控制信息
*/
@PostMapping("/buttonCondition")
public R buttonCondition(@RequestBody LabSubmitVo data) {
if (StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getReferenceNo())) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
return R.ok().put("data", labService.getButtonCondition(data.getSite(), data.getReferenceNo()));
}
/**
* 删除
*/
@PostMapping("/delete")
@Transactional
public R delete(@RequestBody LabEntity lab) {
if (StringUtils.isBlank(lab.getSite()) || StringUtils.isBlank(lab.getReferenceNo())) {
return R.error("工厂(site)和序列号(referenceNo)不能为空");
}
QueryWrapper<LabEntity> deleteWrapper = new QueryWrapper<>();
deleteWrapper.eq("site", lab.getSite()).eq("reference_no", lab.getReferenceNo());
labService.remove(deleteWrapper);
QueryWrapper<SysOssEntity> ossWrapper = new QueryWrapper<>();
ossWrapper.eq("order_ref1", lab.getSite());
ossWrapper.eq("order_ref2", lab.getReferenceNo());
sysOssService.remove(ossWrapper);
return R.ok();
}
private String getCurrentUserName() {
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
return user == null ? "" : user.getUsername();
}
}

248
src/main/java/com/spring/modules/lab/entity/LabEntity.java

@ -0,0 +1,248 @@
package com.spring.modules.lab.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* Lab 实验室申请实体类
*/
@Data
@TableName("plm_lab")
public class LabEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 工厂
*/
private String site;
/**
* 序列号
*/
private String referenceNo;
/**
* 申请人
*/
private String applicant;
/**
* 申请日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date applicationDate;
/**
* 申请部门
*/
private String applyDepartment;
/**
* 需求日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date requestedDate;
/**
* 项目编码
*/
private String projectId;
/**
* 客户编码
*/
private String customerId;
/**
* 样品名称
*/
private String sampleName;
/**
* 样品型号
*/
private String sampleModel;
/**
* 样品数量
*/
private String sampleQty;
/**
* 测试目的
*/
private String testPurpose;
/**
* 产品阶段
*/
private String productStage;
/**
* 测试类型
*/
private String testType;
/**
* 报告出具
*/
private String reportDocument;
/**
* 样品退回
*/
private String returnSample;
/**
* 应用表面
*/
private String applicationSurface;
/**
* 测试实验室
*/
private String testLab;
/**
* 注意事项
*/
private String attention;
/**
* 测试开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date testStartDate;
/**
* 测试完成日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date completedDate;
/**
* 异常情况及说明
*/
private String unnormalSymptomAndDescription;
/**
* 测试编码
*/
private String testNumber;
/**
* 备注测试员
*/
private String testerComments;
/**
* 备注部门经理
*/
private String departmentManagerComments;
/**
* 备注实验室
*/
private String labComments;
/**
* 测试人;分隔
*/
private String tester;
/**
* 单据状态草稿/审批中/已完成
*/
private String status;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createDate;
/**
* 创建人
*/
private String createBy;
/**
* 修改时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateDate;
/**
* 修改人
*/
private String updateBy;
/**
* 流程步骤
*/
private Integer stepId;
/**
* 驳回标识
*/
private String rejectFlag;
/**
* 驳回步骤
*/
private Integer rejectStepId;
/**
* 当前节点 ID
*/
@TableField(exist = false)
private String nodeId;
/**
* 当前节点名称
*/
@TableField(exist = false)
private String nodeName;
/**
* 当前节点审批人
*/
@TableField(exist = false)
private String currentApprover;
/**
* 申请人名称
*/
@TableField(exist = false)
private String applicantName;
/**
* 客户名称
*/
@TableField(exist = false)
private String customerName;
/**
* 项目名称
*/
@TableField(exist = false)
private String projectName;
/**
* 测试人名称
*/
@TableField(exist = false)
private String testerName;
}

24
src/main/java/com/spring/modules/lab/mapper/LabMapper.java

@ -0,0 +1,24 @@
package com.spring.modules.lab.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.spring.modules.change.vo.ProcessFormVo;
import com.spring.modules.lab.entity.LabEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* Lab Mapper
*/
@Mapper
public interface LabMapper extends BaseMapper<LabEntity> {
List<ProcessFormVo> getApprovalList(@Param("site") String site, @Param("menuId") String menuId, @Param("documentNo") String documentNo);
IPage<LabEntity> queryPageWithNames(IPage<?> page, @Param("params") Map<String, Object> params);
LabEntity getDetailWithNames(@Param("site") String site, @Param("referenceNo") String referenceNo);
}

47
src/main/java/com/spring/modules/lab/service/LabService.java

@ -0,0 +1,47 @@
package com.spring.modules.lab.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.spring.common.utils.PageUtils;
import com.spring.modules.change.vo.ProcessFormVo;
import com.spring.modules.lab.entity.LabEntity;
import com.spring.modules.lab.vo.LabSubmitVo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Lab Service
*/
public interface LabService extends IService<LabEntity> {
/**
* 分页查询
*/
PageUtils queryPage(Map<String, Object> params);
/**
* 详情查询
*/
LabEntity getDetail(String site, String referenceNo);
/**
* 下达
*/
void issue(String site, String referenceNo, String userName, String menuId);
/**
* 提交审批结论
*/
void submit(LabSubmitVo data, String userName);
/**
* 查询审批记录
*/
List<ProcessFormVo> getApprovalList(String site, String menuId, String documentNo);
/**
* 查询当前按钮控制信息
*/
HashMap<String, String> getButtonCondition(String site, String referenceNo);
}

411
src/main/java/com/spring/modules/lab/service/impl/LabServiceImpl.java

@ -0,0 +1,411 @@
package com.spring.modules.lab.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spring.common.utils.Constant;
import com.spring.common.utils.DateUtils;
import com.spring.common.utils.PageUtils;
import com.spring.common.utils.Query;
import com.spring.modules.base.data.OaUserData;
import com.spring.modules.base.utils.HttpClientUtil;
import com.spring.modules.base.utils.ResponseData;
import com.spring.modules.change.entity.APIEntity.DoForceDrawBackParam;
import com.spring.modules.change.entity.APIEntity.MainData;
import com.spring.modules.change.entity.APIEntity.SubmitRequestParam;
import com.spring.modules.change.entity.ParamData;
import com.spring.modules.change.entity.ProcessFormEntity;
import com.spring.modules.change.mapper.ChangeManagementMapper;
import com.spring.modules.change.service.impl.ChangeManagementServiceImpl;
import com.spring.modules.change.vo.ProcessFormVo;
import com.spring.modules.lab.entity.LabEntity;
import com.spring.modules.lab.mapper.LabMapper;
import com.spring.modules.lab.service.LabService;
import com.spring.modules.lab.vo.LabSubmitVo;
import com.spring.modules.request.vo.PlmRequestDetailVo;
import com.spring.modules.sys.dao.SysUserDao;
import com.spring.modules.sys.entity.SysUserEntity;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.spring.modules.base.utils.CommonUtils.getPropertyValue;
@Service("labService")
public class LabServiceImpl extends ServiceImpl<LabMapper, LabEntity> implements LabService {
@Autowired
private SysUserDao sysUserDao;
@Autowired
private ChangeManagementMapper changeManagementMapper;
@Autowired
private ChangeManagementServiceImpl changeManagementService;
@Value("${oa-control.control-flag}")
private Boolean dataUrlOa;
@Value("${oa-api.api-url}")
private String apiUrlOa;
@Override
public PageUtils queryPage(Map<String, Object> params) {
params.put("referenceNo", toLikeParam((String) params.get("referenceNo")));
params.put("applicant", toLikeParam((String) params.get("applicant")));
params.put("currentApprover", toLikeParam((String) params.get("currentApprover")));
IPage<LabEntity> page = this.baseMapper.queryPageWithNames(
new Query<LabEntity>().getPage(params),
params
);
return new PageUtils(page);
}
@Override
public LabEntity getDetail(String site, String referenceNo) {
return this.baseMapper.getDetailWithNames(site, referenceNo);
}
@Override
@Transactional
public void issue(String site, String referenceNo, String userName, String menuId) {
LabEntity lab = this.getDetail(site, referenceNo);
if (lab == null) {
throw new RuntimeException("未找到对应Lab单据");
}
if (!"草稿".equals(lab.getStatus())) {
throw new RuntimeException("仅草稿状态的单据允许下达");
}
if (StringUtils.isBlank(userName)) {
throw new RuntimeException("下达人不能为空");
}
if (StringUtils.isBlank(menuId)) {
throw new RuntimeException("菜单ID不能为空");
}
if (!dataUrlOa) {
LabEntity updateEntity = new LabEntity();
updateEntity.setStatus("已完成");
QueryWrapper<LabEntity> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("site", site).eq("reference_no", referenceNo);
this.update(updateEntity, updateWrapper);
return;
}
Map<String, String> baseData = changeManagementService.getReleaseBaseData(site, userName, menuId, referenceNo);
List<PlmRequestDetailVo> nodeDetails = changeManagementMapper.queryNodeDetailFirst(site, baseData.get("workflowId"), menuId);
if (nodeDetails == null || nodeDetails.isEmpty()) {
throw new RuntimeException("流程节点信息获取异常!");
}
List<MainData> mainData = new ArrayList<>();
for (PlmRequestDetailVo nodeDetail : nodeDetails) {
if (nodeDetail.getId() == null) {
continue;
}
MainData md = new MainData();
md.setFieldName(nodeDetail.getOaField());
String fieldValue = "";
if (StringUtils.isNotBlank(nodeDetail.getFieldValue())) {
md.setFieldValue(nodeDetail.getFieldValue());
mainData.add(md);
continue;
}
if ("plm_lab".equals(nodeDetail.getPlmTable())) {
Object valueObj = getPropertyValue(lab, nodeDetail.getPlmField());
fieldValue = convertFieldValue(valueObj);
if (StringUtils.isNotBlank(fieldValue) && "A".equals(nodeDetail.getFieldType())) {
fieldValue = convertUserFieldToOaIds(fieldValue);
}
}
if (StringUtils.isNotBlank(fieldValue)) {
md.setFieldValue(fieldValue);
} else {
if ("Y".equals(nodeDetail.getReview())) {
String fieldName = changeManagementService.getFieldName(nodeDetail.getPlmTable(), nodeDetail.getPlmField());
throw new RuntimeException("[" + fieldName + "] 参数在当前节点是必填项,无法下达/提交该流程!");
} else if ("N".equals(nodeDetail.getReview()) && "A".equals(nodeDetail.getFieldType())) {
continue;
} else {
md.setFieldValue("");
}
}
mainData.add(md);
}
ParamData paramData = new ParamData(site, baseData.get("domainControlAccount"), nodeDetails.get(0).getNodeId(), nodeDetails.get(0).getNodeName(),
referenceNo, userName, baseData.get("classificationNo"), nodeDetails.get(0).getStepId(), baseData.get("menuId"), baseData.get("menuName"),
baseData.get("userId"), baseData.get("workflowId"), baseData.get("workflowname"), baseData.get("requestName"), mainData, baseData.get("path"),
"", "plm_lab", "reference_no", "status");
try {
changeManagementService.issueFunction(paramData, Constant.LAB);
if ("已完成".equals(paramData.getStatus())) {
return;
}
} catch (Exception e) {
changeManagementService.rollBackFunction(paramData, e);
throw new RuntimeException(e.getMessage());
}
LabEntity updateEntity = new LabEntity();
updateEntity.setStatus("审批中");
QueryWrapper<LabEntity> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("site", site).eq("reference_no", referenceNo);
this.update(updateEntity, updateWrapper);
}
@Override
@Transactional
public void submit(LabSubmitVo data, String userName) {
if (data == null || StringUtils.isBlank(data.getSite()) || StringUtils.isBlank(data.getReferenceNo())) {
throw new RuntimeException("工厂(site)和序列号(referenceNo)不能为空");
}
String site = data.getSite();
String referenceNo = data.getReferenceNo();
String nodeConclusion = data.getNodeConclusion();
String rejectOpinion = data.getRejectOpinion();
LabEntity current = this.getDetail(site, referenceNo);
if (current == null) {
throw new RuntimeException("未找到对应Lab单据");
}
if (!"审批中".equals(current.getStatus())) {
throw new RuntimeException("仅审批中状态的单据允许提交审批结论");
}
if (StringUtils.isBlank(userName)) {
throw new RuntimeException("提交人不能为空");
}
if (!"Y".equals(nodeConclusion) && !"N".equals(nodeConclusion)) {
throw new RuntimeException("审批结论仅支持Y(同意)或N(驳回)");
}
LabEntity updateEntity = new LabEntity();
BeanUtils.copyProperties(data, updateEntity);
updateEntity.setStatus(null);
updateEntity.setStepId(null);
updateEntity.setRejectFlag(null);
updateEntity.setRejectStepId(null);
updateEntity.setCreateDate(null);
updateEntity.setCreateBy(null);
updateEntity.setUpdateDate(new Date());
updateEntity.setUpdateBy(userName);
QueryWrapper<LabEntity> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("site", site).eq("reference_no", referenceNo);
this.update(updateEntity, updateWrapper);
if (!dataUrlOa) {
LabEntity statusEntity = new LabEntity();
statusEntity.setStatus("已完成");
statusEntity.setUpdateDate(new Date());
statusEntity.setUpdateBy(userName);
QueryWrapper<LabEntity> statusWrapper = new QueryWrapper<>();
statusWrapper.eq("site", site).eq("reference_no", referenceNo);
this.update(statusEntity, statusWrapper);
return;
}
LabEntity lab = this.getDetail(site, referenceNo);
if (lab == null) {
throw new RuntimeException("更新后未找到对应Lab单据");
}
Map<String, String> baseData = changeManagementService.getSubmitBaseData(site, userName, referenceNo);
ParamData paramData = new ParamData(site, baseData.get("nodeId"), baseData.get("nodeName"), referenceNo, userName, baseData.get("classificationNo"),
baseData.get("userId"), baseData.get("workflowId"), baseData.get("workflowname"), baseData.get("requestName"), baseData.get("path"), baseData.get("requestId"),
"plm_lab", "reference_no", "status", lab.getStepId(), "",
baseData.get("domainControlAccount"), baseData.get("menuId"), baseData.get("menuName"), nodeConclusion, StringUtils.defaultString(rejectOpinion), baseData.get("nodeId"));
if ("Y".equals(nodeConclusion)) {
List<MainData> mainData = getSubmitMainData(site, baseData, lab);
paramData.setMainData(mainData);
SubmitRequestParam submitRequestParam = new SubmitRequestParam();
submitRequestParam.setUserId(paramData.getUserId());
submitRequestParam.setRequestId(paramData.getRequestId());
submitRequestParam.setMainData(paramData.getMainData());
String submitRequestURL = apiUrlOa + "/oa/interface/submitRequest";
ResponseData submitRequestResponses = HttpClientUtil.doPostByRawWithOA(submitRequestURL, submitRequestParam);
if (!"0".equals(submitRequestResponses.getCode())) {
throw new RuntimeException("OA提交流程异常信息:" + submitRequestResponses.getMsg());
}
try {
changeManagementService.agreeFunction(paramData, Constant.LAB);
} catch (Exception e) {
handleSubmitRollback(paramData, e);
}
} else {
SubmitRequestParam submitRequestParam = new SubmitRequestParam();
submitRequestParam.setUserId(paramData.getUserId());
submitRequestParam.setRequestId(paramData.getRequestId());
String submitRequestURL = apiUrlOa + "/oa/interface/rejectRequest";
ResponseData submitRequestResponses = HttpClientUtil.doPostByRawWithOA(submitRequestURL, submitRequestParam);
if (!"0".equals(submitRequestResponses.getCode())) {
throw new RuntimeException("OA流程退回异常信息:" + submitRequestResponses.getMsg());
}
try {
changeManagementService.rejectFunction(paramData, Constant.LAB);
} catch (Exception e) {
handleSubmitRollback(paramData, e);
}
}
}
@Override
public List<ProcessFormVo> getApprovalList(String site, String menuId, String documentNo) {
if (StringUtils.isBlank(site) || StringUtils.isBlank(menuId) || StringUtils.isBlank(documentNo)) {
return Collections.emptyList();
}
return this.baseMapper.getApprovalList(site, menuId, documentNo);
}
@Override
public HashMap<String, String> getButtonCondition(String site, String referenceNo) {
HashMap<String, String> result = new HashMap<>();
result.put("createBy2", "");
result.put("isReject", "Y");
result.put("tpProcessControl", "N");
result.put("csProcessControl", "N");
if (StringUtils.isBlank(site) || StringUtils.isBlank(referenceNo)) {
return result;
}
List<ProcessFormEntity> currentProcessList = changeManagementMapper.queryRequestId(site, "", referenceNo);
if (currentProcessList == null || currentProcessList.isEmpty()) {
return result;
}
Set<String> approvers = new LinkedHashSet<>();
for (ProcessFormEntity processForm : currentProcessList) {
String approver = processForm.getUpdateBy();
if (StringUtils.isBlank(approver) && StringUtils.isNotBlank(processForm.getDomainControlAccount())) {
SysUserEntity sysUser = sysUserDao.selectOne(
new QueryWrapper<SysUserEntity>().eq("domain_control_account", processForm.getDomainControlAccount())
);
if (sysUser != null) {
approver = sysUser.getUsername();
}
}
if (StringUtils.isNotBlank(approver)) {
approvers.add(approver);
}
}
result.put("createBy2", String.join(";", approvers));
return result;
}
private List<MainData> getSubmitMainData(String site, Map<String, String> baseData, LabEntity lab) {
List<MainData> mainData = new ArrayList<>();
List<PlmRequestDetailVo> nodeDetails = changeManagementMapper.queryNodeDetails(site, baseData.get("workflowId"), baseData.get("nodeId"), baseData.get("classificationNo"));
if (nodeDetails == null || nodeDetails.isEmpty()) {
return mainData;
}
for (PlmRequestDetailVo nodeDetail : nodeDetails) {
if (nodeDetail.getId() == null) {
continue;
}
MainData md = new MainData();
md.setFieldName(nodeDetail.getOaField());
String fieldValue = "";
if (StringUtils.isNotBlank(nodeDetail.getFieldValue())) {
md.setFieldValue(nodeDetail.getFieldValue());
mainData.add(md);
continue;
}
if ("plm_lab".equals(nodeDetail.getPlmTable())) {
Object valueObj = getPropertyValue(lab, nodeDetail.getPlmField());
fieldValue = convertFieldValue(valueObj);
if (StringUtils.isNotBlank(fieldValue) && "A".equals(nodeDetail.getFieldType())) {
fieldValue = convertUserFieldToOaIds(fieldValue);
}
}
if (StringUtils.isNotBlank(fieldValue)) {
md.setFieldValue(fieldValue);
} else {
if ("Y".equals(nodeDetail.getReview())) {
String fieldName = changeManagementService.getFieldName(nodeDetail.getPlmTable(), nodeDetail.getPlmField());
throw new RuntimeException("[" + fieldName + "] 参数在当前节点是必填项,无法下达/提交该流程!");
} else if ("N".equals(nodeDetail.getReview()) && "A".equals(nodeDetail.getFieldType())) {
continue;
} else {
md.setFieldValue("");
}
}
mainData.add(md);
}
return mainData;
}
private String convertUserFieldToOaIds(String fieldValue) {
String[] users = fieldValue.replace(";", ",").split(",");
StringBuilder oaIdList = new StringBuilder();
for (String userCode : users) {
String username = StringUtils.trim(userCode);
if (StringUtils.isBlank(username)) {
continue;
}
SysUserEntity sysUser = sysUserDao.selectOne(new QueryWrapper<SysUserEntity>().eq("username", username));
if (sysUser == null) {
throw new RuntimeException("未找到PLM用户信息,用户编码: " + username);
}
String account = sysUser.getDomainControlAccount();
if (StringUtils.isBlank(account)) {
throw new RuntimeException("未获取到PLM人员域控账号,用户编码: " + username);
}
List<OaUserData> oaIds = sysUserDao.selectOaIdByAccount(account);
if (oaIds == null || oaIds.isEmpty()) {
throw new RuntimeException("未获取到域控账号对应的OA人员,域控账号: " + account);
}
oaIdList.append(oaIds.get(0).getId()).append(",");
}
return oaIdList.length() > 0 ? oaIdList.substring(0, oaIdList.length() - 1) : "";
}
private void handleSubmitRollback(ParamData paramData, Exception e) {
DoForceDrawBackParam doForceDrawBackParam = new DoForceDrawBackParam();
doForceDrawBackParam.setUserId(paramData.getUserId());
doForceDrawBackParam.setRequestId(paramData.getRequestId());
String doForceDrawBackURL = apiUrlOa + "/oa/interface/doForceDrawBack";
ResponseData doForceDrawBackResponses = HttpClientUtil.doPostByRawWithOA(doForceDrawBackURL, doForceDrawBackParam);
if (!"0".equals(doForceDrawBackResponses.getCode())) {
if ("NO_PERMISSION".equals(doForceDrawBackResponses.getCode())) {
throw new RuntimeException("OA撤回流程异常信息:流程提交异常,无撤回权限,请联系管理员! 导致OA撤回的PLM异常:" + e.getMessage());
}
throw new RuntimeException("OA撤回流程异常信息:" + doForceDrawBackResponses.getMsg() + " 导致OA撤回的PLM异常:" + e.getMessage());
}
throw new RuntimeException(e.getMessage());
}
private String toLikeParam(String value) {
if (StringUtils.isBlank(value)) {
return null;
}
return "%" + value.trim() + "%";
}
private String convertFieldValue(Object valueObj) {
if (valueObj == null) {
return "";
}
if (valueObj instanceof Date) {
return DateUtils.format((Date) valueObj);
}
return String.valueOf(valueObj);
}
}

29
src/main/java/com/spring/modules/lab/vo/LabSubmitVo.java

@ -0,0 +1,29 @@
package com.spring.modules.lab.vo;
import com.spring.modules.lab.entity.LabEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Lab 提交流程参数
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class LabSubmitVo extends LabEntity {
private static final long serialVersionUID = 1L;
private String site;
private String referenceNo;
/**
* Y=同意, N=驳回
*/
private String nodeConclusion;
private String rejectOpinion;
private String menuId;
private String documentNo;
}

110
src/main/resources/mapper/lab/LabMapper.xml

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.modules.lab.mapper.LabMapper">
<resultMap id="BaseResultMap" type="com.spring.modules.lab.entity.LabEntity">
<result column="site" property="site"/>
<result column="reference_no" property="referenceNo"/>
<result column="applicant" property="applicant"/>
<result column="application_date" property="applicationDate"/>
<result column="apply_department" property="applyDepartment"/>
<result column="requested_date" property="requestedDate"/>
<result column="project_id" property="projectId"/>
<result column="customer_id" property="customerId"/>
<result column="sample_name" property="sampleName"/>
<result column="sample_model" property="sampleModel"/>
<result column="sample_qty" property="sampleQty"/>
<result column="test_purpose" property="testPurpose"/>
<result column="product_stage" property="productStage"/>
<result column="test_type" property="testType"/>
<result column="report_document" property="reportDocument"/>
<result column="return_sample" property="returnSample"/>
<result column="application_surface" property="applicationSurface"/>
<result column="test_lab" property="testLab"/>
<result column="attention" property="attention"/>
<result column="test_start_date" property="testStartDate"/>
<result column="completed_date" property="completedDate"/>
<result column="unnormal_symptom_and_description" property="unnormalSymptomAndDescription"/>
<result column="test_number" property="testNumber"/>
<result column="tester_comments" property="testerComments"/>
<result column="department_manager_comments" property="departmentManagerComments"/>
<result column="lab_comments" property="labComments"/>
<result column="tester" property="tester"/>
<result column="status" property="status"/>
<result column="create_date" property="createDate"/>
<result column="create_by" property="createBy"/>
<result column="update_date" property="updateDate"/>
<result column="update_by" property="updateBy"/>
<result column="step_id" property="stepId"/>
<result column="reject_flag" property="rejectFlag"/>
<result column="reject_step_id" property="rejectStepId"/>
<result column="nodeId" property="nodeId"/>
<result column="nodeName" property="nodeName"/>
<result column="currentApprover" property="currentApprover"/>
<result column="applicantName" property="applicantName"/>
<result column="customerName" property="customerName"/>
<result column="projectName" property="projectName"/>
<result column="testerName" property="testerName"/>
</resultMap>
<sql id="Base_Column_List">
a.site, a.reference_no, a.applicant, a.application_date, a.apply_department, a.requested_date,
a.project_id, a.customer_id, a.sample_name, a.sample_model, a.sample_qty, a.test_purpose,
a.product_stage, a.test_type, a.report_document, a.return_sample, a.application_surface, a.test_lab,
a.attention, a.test_start_date, a.completed_date, a.unnormal_symptom_and_description, a.test_number,
a.tester_comments, a.department_manager_comments, a.lab_comments, a.tester, a.status, a.create_date,
a.create_by, a.update_date, a.update_by, a.step_id, a.reject_flag, a.reject_step_id
</sql>
<select id="getApprovalList" resultType="com.spring.modules.change.vo.ProcessFormVo">
exec dbo.get_process_form #{site},#{menuId},#{documentNo}
</select>
<select id="queryPageWithNames" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>,
d.node_id as nodeId,
d.node_name as nodeName,
dbo.get_plm_Approval_username(a.site, prh.workflow_id, d.node_id, a.reference_no) as currentApprover,
dbo.get_userDisPlay(a.applicant) as applicantName,
dbo.plm_get_customer_desc(a.site, a.customer_id) as customerName,
dbo.plm_get_project_name(a.site, a.project_id) as projectName,
dbo.get_userDisPlay(a.tester) as testerName
from plm_lab a
left join plm_request_header prh on a.site = prh.site and prh.menu_id = #{params.menuId} and prh.status = 'Y'
left join plm_request_node d on a.site = d.site and prh.classification_no = d.classification_no and prh.workflow_id = d.workflow_id and a.step_id = d.step_id
where 1 = 1
<if test="params.site != null and params.site != ''">
and a.site = #{params.site}
</if>
<if test="params.referenceNo != null and params.referenceNo != ''">
and a.reference_no like #{params.referenceNo}
</if>
<if test="params.status != null and params.status != ''">
and a.status = #{params.status}
</if>
<if test="params.nodeId != null and params.nodeId != ''">
and d.node_id = #{params.nodeId}
</if>
<if test="params.currentApprover != null and params.currentApprover != ''">
and dbo.get_plm_Approval_username(a.site, prh.workflow_id, d.node_id, a.reference_no) like #{params.currentApprover}
</if>
<if test="params.applicant != null and params.applicant != ''">
and a.applicant like #{params.applicant}
</if>
order by a.application_date desc
</select>
<select id="getDetailWithNames" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>,
dbo.get_userDisPlay(a.applicant) as applicantName,
dbo.plm_get_customer_desc(a.site, a.customer_id) as customerName,
dbo.plm_get_project_name(a.site, a.project_id) as projectName,
dbo.get_userDisPlay(a.tester) as testerName
from plm_lab a
where a.site = #{site}
and a.reference_no = #{referenceNo}
</select>
</mapper>
Loading…
Cancel
Save