.DS_StoreBinary files differ
src/main/java/com/ruoyi/approve/bean/dto/ApproveProcessConfigNodeDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import lombok.Data; import java.util.List; @Data public class ApproveProcessConfigNodeDto extends ApproveProcessConfigNode { private List<ApproveProcessConfigNode> approveProcessConfigNodes; } src/main/java/com/ruoyi/approve/bean/vo/ApproveGetAndUpdateVo.java
ÎļþÃû´Ó src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java ÐÞ¸Ä @@ -1,7 +1,8 @@ package com.ruoyi.approve.vo; package com.ruoyi.approve.bean.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import com.ruoyi.sales.pojo.CommonFile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; src/main/java/com/ruoyi/approve/bean/vo/ApproveProcessConfigNodeVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import lombok.Data; @Data public class ApproveProcessConfigNodeVo extends ApproveProcessConfigNode { } src/main/java/com/ruoyi/approve/bean/vo/ApproveProcessVO.java
ÎļþÃû´Ó src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java ÐÞ¸Ä @@ -1,13 +1,11 @@ package com.ruoyi.approve.vo; package com.ruoyi.approve.bean.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.sales.pojo.CommonFile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -47,6 +45,8 @@ */ private String approveReason; private Long recordId; @Excel(name = "å¼å§æ¶é´", dateFormat = "yyyy-MM-dd",width = 30) @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "å¼å§æ¶é´") src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package com.ruoyi.approve.controller; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import com.ruoyi.approve.service.ApproveProcessConfigNodeService; import com.ruoyi.framework.web.domain.R; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * å®¡æ¹æµç¨é ç½®èç¹è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-04-23 10:21:41 */ @RestController @RequestMapping("/approveProcessConfigNode") @AllArgsConstructor public class ApproveProcessConfigNodeController { private final ApproveProcessConfigNodeService approveProcessConfigNodeService; /** * æ¥è¯¢å®¡æ¹ä¸é¢çèç¹ * @param type * @return */ @GetMapping("/list") public R listNode(Integer type) { return R.ok(approveProcessConfigNodeService.listNode(type)); } /** * æ·»å 审æ¹èç¹ * @param approveProcessConfigNodes * @return */ @ApiOperation("æ·»å 审æ¹èç¹") @PostMapping("/add") public R addApproveProcessConfigNodes(@RequestBody List<ApproveProcessConfigNode> approveProcessConfigNodes) { return R.ok(approveProcessConfigNodeService.addApproveProcessConfigNodes(approveProcessConfigNodes)); } } src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -5,8 +5,8 @@ import com.ruoyi.account.pojo.AccountExpense; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.security.LoginUser; src/main/java/com/ruoyi/approve/mapper/ApproveProcessConfigNodeMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import org.apache.ibatis.annotations.Mapper; /** * <p> * å®¡æ¹æµç¨é ç½®èç¹è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-04-23 10:21:41 */ @Mapper public interface ApproveProcessConfigNodeMapper extends BaseMapper<ApproveProcessConfigNode> { } src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -1,11 +1,5 @@ package com.ruoyi.approve.pojo; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; @@ -14,6 +8,11 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; import java.util.List; /** * å®¡æ¹æµç¨è¡¨ @@ -79,6 +78,8 @@ @ApiModelProperty(value = "ç³è¯·åå ") @Excel(name = "审æ¹äºç±") private String approveReason; //ä¸å¡id private Long recordId; /** * å½å审æ¹ç¨æ·ID src/main/java/com/ruoyi/approve/pojo/ApproveProcessConfigNode.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,118 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * å®¡æ¹æµç¨é ç½®èç¹è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-04-23 10:21:41 */ @Getter @Setter @ToString @TableName("approve_process_config_node") @ApiModel(value = "ApproveProcessConfigNode对象", description = "å®¡æ¹æµç¨é ç½®èç¹è¡¨") public class ApproveProcessConfigNode implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @ApiModelProperty("主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; // '审æ¹ç±»åï¼1å ¬åºç®¡çï¼2请å管çï¼3åºå·®ç®¡çï¼4æ¥é管çï¼5éè´å®¡æ¹ï¼6æ¥ä»·å®¡æ¹ï¼7å货审æ¹ï¼8å±é©ä½ä¸å®¡æ¹', @ApiModelProperty("审æ¹ç±»åï¼1å ¬åºç®¡çï¼2请å管çï¼3åºå·®ç®¡çï¼4æ¥é管çï¼5éè´å®¡æ¹ï¼6æ¥ä»·å®¡æ¹ï¼7å货审æ¹ï¼8å±é©ä½ä¸å®¡æ¹") private Integer approveType; /** * èç¹é¡ºåº */ @ApiModelProperty("èç¹é¡ºåº") private Integer nodeOrder; /** * 审æ¹äººIDsï¼å¤ä¸ªç¨éå·åéï¼ */ @ApiModelProperty("审æ¹äººID") private Long approverId; /** * 审æ¹äººåç§° */ @ApiModelProperty("审æ¹äººåç§°") private String approverName; /** * è¶ æ¶æ¶é¿ï¼å°æ¶ï¼ */ @ApiModelProperty("è¶ æ¶æ¶é¿ï¼å°æ¶ï¼") private Integer timeoutHours; /** * ç§æ·ID */ @ApiModelProperty("ç§æ·ID") private Long tenantId; /** * åå»ºç¨æ·ID */ @ApiModelProperty("åå»ºç¨æ·ID") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @ApiModelProperty("å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * ä¿®æ¹ç¨æ·ID */ @ApiModelProperty("ä¿®æ¹ç¨æ·ID") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * ä¿®æ¹æ¶é´ */ @ApiModelProperty("ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * å 餿 è®°ï¼0æ£å¸¸ï¼1å é¤ */ @ApiModelProperty("å 餿 è®°ï¼0æ£å¸¸ï¼1å é¤") private Boolean deleteFlag; /** * é¨é¨ID */ @ApiModelProperty("é¨é¨ID") @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/approve/service/ApproveProcessConfigNodeService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.bean.vo.ApproveProcessConfigNodeVo; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * å®¡æ¹æµç¨é ç½®èç¹è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-04-23 10:21:41 */ public interface ApproveProcessConfigNodeService extends IService<ApproveProcessConfigNode> { List<ApproveProcessConfigNodeVo> listNode(Integer type); Boolean addApproveProcessConfigNodes(List<ApproveProcessConfigNode> approveProcessConfigNodes); } src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -3,14 +3,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.project.system.domain.SysDept; import java.io.IOException; import java.text.ParseException; import java.util.List; public interface IApproveProcessService extends IService<ApproveProcess> { src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.mapper.ApproveNodeMapper; @@ -13,10 +12,8 @@ import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.other.service.impl.TempFileServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.project.system.domain.SysUser; @@ -24,14 +21,25 @@ import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl; import com.ruoyi.sales.mapper.*; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityTestStandardParamMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.SalesQuotationMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.SalesQuotation; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.sales.service.impl.SalesLedgerProductServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -43,44 +51,27 @@ import java.util.List; @Service //@RequiredArgsConstructor @RequiredArgsConstructor public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService { @Autowired private ApproveNodeMapper approveNodeMapper; @Autowired private ApproveProcessMapper approveProcessMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private TempFileServiceImpl tempFileService; @Autowired private ISysNoticeService sysNoticeService; @Autowired private CommonFileMapper fileMapper; @Autowired private DeviceRepairMapper deviceRepairMapper; @Autowired private PurchaseLedgerMapper purchaseLedgerMapper; @Autowired private SalesQuotationMapper salesQuotationMapper; @Autowired private ShippingInfoMapper shippingInfoMapper; @Autowired private CommonFileServiceImpl commonFileService; @Autowired private StockUtils stockUtils; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Autowired private PurchaseLedgerServiceImpl purchaseLedgerServiceImpl; private final ApproveNodeMapper approveNodeMapper; private final ApproveProcessMapper approveProcessMapper; private final SysUserMapper sysUserMapper; private final TempFileServiceImpl tempFileService; private final ISysNoticeService sysNoticeService; private final CommonFileMapper fileMapper; private final DeviceRepairMapper deviceRepairMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; private final SalesQuotationMapper salesQuotationMapper; private final ShippingInfoMapper shippingInfoMapper; private final CommonFileServiceImpl commonFileService; private final StockUtils stockUtils; private final SalesLedgerProductMapper salesLedgerProductMapper; private final QualityInspectMapper qualityInspectMapper; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; public ApproveProcess getApproveById(String id) { @@ -94,7 +85,7 @@ } @Override public void initApproveNodes(String approveUserIds,String approveID,Long tenantId) { public void initApproveNodes(String approveUserIds, String approveID, Long tenantId) { Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); String[] names = approveUserIds.split(","); for (int i = 0; i < names.length; i++) { @@ -102,7 +93,7 @@ if (sysUser == null) continue; ApproveNode approveNode = new ApproveNode(); approveNode.setApproveProcessId(approveID); approveNode.setApproveNodeOrder(i +1); approveNode.setApproveNodeOrder(i + 1); approveNode.setApproveNodeUser(sysUser.getNickName()); approveNode.setApproveNodeUserId(sysUser.getUserId()); approveNode.setApproveNodeTime(new Date()); @@ -132,17 +123,17 @@ // .eq(ApproveProcess::getApproveStatus, 0) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if(approveProcess != null && approveProcess.getApproveStatus() == 3){ if (approveProcess != null && approveProcess.getApproveStatus() == 3) { return list; } for (ApproveNode approveNode : list) { List<CommonFile> commonFiles = fileMapper.selectList(new LambdaQueryWrapper<CommonFile>() .eq(CommonFile::getCommonId, approveNode.getId()) .eq(CommonFile::getType, FileNameType.ApproveNode.getValue())); if(!CollectionUtils.isEmpty(commonFiles)){ if (!CollectionUtils.isEmpty(commonFiles)) { approveNode.setUrl(commonFiles.get(0).getUrl()); } if(approveNode.getApproveNodeStatus() == 1){ if (approveNode.getApproveNodeStatus() == 1) { continue; } approveNode.setIsShen(true); @@ -151,13 +142,13 @@ return list; } public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) throws IOException { public void updateApproveProcessStatus(ApproveNode approveNode, Integer status) throws IOException { LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId()) .eq(ApproveProcess::getApproveDelete, 0) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if(approveProcess == null) throw new RuntimeException("审æ¹ä¸åå¨"); if (approveProcess == null) throw new RuntimeException("审æ¹ä¸åå¨"); LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveNode.getApproveProcessId()) .eq(ApproveNode::getApproveNodeOrder, approveNode.getApproveNodeOrder() + 1) @@ -166,33 +157,21 @@ .last("limit 1"); ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper); approveProcess.setApproveStatus(status); if(approveNode1 != null){ if (approveNode1 != null) { approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId()); approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser()); } if(approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)){ if (approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)) { approveProcess.setApproveOverTime(new Date()); } approveProcessMapper.updateById(approveProcess); DeviceRepair deviceRepair = deviceRepairMapper.selectById(approveProcess.getDeviceRepairId()); if(ObjectUtils.isNotNull(deviceRepair)) { if(approveProcess.getApproveStatus().equals(2)){ // åæ deviceRepair.setStatus(1); }else if(approveProcess.getApproveStatus().equals(3)){ // æç» deviceRepair.setStatus(2); } deviceRepairMapper.updateById(deviceRepair); } //éè´å®¡æ ¸ if(approveProcess.getApproveType().equals(5)){ if (approveProcess.getApproveType().equals(5)) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() .eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason()) .last("limit 1")); if(purchaseLedger != null) { if (purchaseLedger != null) { if (status.equals(2)) { // åæ purchaseLedger.setApprovalStatus(3); @@ -201,8 +180,8 @@ for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { // è´¨æ£ if (salesLedgerProduct.getIsChecked()) { purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct); }else { addQualityInspect(purchaseLedger, salesLedgerProduct); } else { //ç´æ¥å ¥åº stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId()); } @@ -218,41 +197,47 @@ } } // é宿¥ä»·ç¶æä¿®æ¹ if(approveProcess.getApproveType().equals(6)){ if (approveProcess.getApproveType().equals(6)) { SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>() .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason()) .last("limit 1")); // åæ if(status.equals(2) && salesQuote != null){ if (status.equals(2) && salesQuote != null) { salesQuote.setStatus("éè¿"); }else if(status.equals(3) && salesQuote != null){ } else if (status.equals(3) && salesQuote != null) { salesQuote.setStatus("æç»"); }else if(status.equals(1) && salesQuote != null){ } else if (status.equals(1) && salesQuote != null) { salesQuote.setStatus("å®¡æ ¸ä¸"); } salesQuotationMapper.updateById(salesQuote); } // åºåºå®¡æ¹ä¿®æ¹ if(approveProcess.getApproveType().equals(7)){ if (approveProcess.getApproveType().equals(7)) { String[] split = approveProcess.getApproveReason().split(":"); ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getShippingNo, split[1]) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if(shippingInfo != null){ if(status.equals(2)){ if (shippingInfo != null) { if (status.equals(2)) { shippingInfo.setStatus("å®¡æ ¸éè¿"); }else if(status.equals(3)){ } else if (status.equals(3)) { shippingInfo.setStatus("å®¡æ ¸æç»"); }else if(status.equals(1)){ } else if (status.equals(1)) { shippingInfo.setStatus("å®¡æ ¸ä¸"); } shippingInfoMapper.updateById(shippingInfo); } } //éå®å®¡æ¹æåä¹åæ·»å çäº§æ°æ® if (approveProcess.getApproveType().equals(9)) { List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>() .eq(SalesLedgerProduct::getSalesLedgerId, approveProcess.getRecordId())); salesLedgerProducts.forEach(salesLedgerProductServiceImpl::addProductionData); } // ç»å®éä»¶ if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){ if (!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1) { tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue()); } } @@ -260,21 +245,21 @@ @Override public void updateApproveNode(ApproveNode approveNode) throws IOException { // 审æ¹èç¹ç¶æ:1åæï¼2æç»ï¼0å°æªå®¡æ ¸ switch (approveNode.getApproveNodeStatus()){ switch (approveNode.getApproveNodeStatus()) { case 1: updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1); /*æ¶æ¯éç¥*/ Integer nodeOrder = approveNode.getApproveNodeOrder(); ApproveProcess approveProcess = approveProcessMapper.selectList(Wrappers.<ApproveProcess>lambdaQuery() .eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())).get(0); if (approveProcess.getApproveUserIds().split(",").length > nodeOrder){ if (approveProcess.getApproveUserIds().split(",").length > nodeOrder) { String id = approveProcess.getApproveUserIds().split(",")[nodeOrder]; if (approveProcess.getApproveType()==8){ if (approveProcess.getApproveType() == 8) { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); }else { } else { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), @@ -307,8 +292,8 @@ } //审æ¹ç±»åè·å(ä¸å端页é¢å¯¹åº) private String approveProcessType(Integer approveType){ switch (approveType){ private String approveProcessType(Integer approveType) { switch (approveType) { case 1: return "å ¬åºç®¡ç"; case 2: @@ -325,8 +310,38 @@ return "å货审æ¹"; case 8: return "å±é©ä½ä¸å®¡æ¹"; case 9: return "éå®å®¡æ¹"; } return null; } private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) { QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setInspectType(0); qualityInspect.setSupplier(purchaseLedger.getSupplierName()); qualityInspect.setPurchaseLedgerId(purchaseLedger.getId()); qualityInspect.setProductId(saleProduct.getProductId()); qualityInspect.setProductName(saleProduct.getProductCategory()); qualityInspect.setModel(saleProduct.getSpecificationModel()); qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null); if (qualityTestStandard.size() > 0) { qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId())) .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); } } } src/main/java/com/ruoyi/approve/service/impl/ApproveProcessConfigNodeServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.vo.ApproveProcessConfigNodeVo; import com.ruoyi.approve.mapper.ApproveProcessConfigNodeMapper; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import com.ruoyi.approve.service.ApproveProcessConfigNodeService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * å®¡æ¹æµç¨é ç½®èç¹è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-04-23 10:21:41 */ @Service @RequiredArgsConstructor public class ApproveProcessConfigNodeServiceImpl extends ServiceImpl<ApproveProcessConfigNodeMapper, ApproveProcessConfigNode> implements ApproveProcessConfigNodeService { private final ApproveProcessConfigNodeMapper approveProcessConfigNodeMapper; @Override public List<ApproveProcessConfigNodeVo> listNode(Integer type) { List<ApproveProcessConfigNode> approveProcessConfigNodes = approveProcessConfigNodeMapper.selectList(new QueryWrapper<ApproveProcessConfigNode>().lambda().eq(ApproveProcessConfigNode::getApproveType, type).orderByAsc(ApproveProcessConfigNode::getNodeOrder)); return approveProcessConfigNodes.stream() .map(node -> { ApproveProcessConfigNodeVo vo = new ApproveProcessConfigNodeVo(); BeanUtils.copyProperties(node, vo); return vo; }) .collect(java.util.stream.Collectors.toList()); } @Override public Boolean addApproveProcessConfigNodes(List<ApproveProcessConfigNode> approveProcessConfigNodes) { //å 餿§æ°æ® approveProcessConfigNodeMapper.delete(new QueryWrapper<ApproveProcessConfigNode>().lambda().eq(ApproveProcessConfigNode::getApproveType, approveProcessConfigNodes.get(0).getApproveType())); //æ°å¢ æ°æ® approveProcessConfigNodes.forEach(approveProcessConfigNodeMapper::insert); return true; } } src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -6,15 +6,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.bean.vo.ApproveProcessConfigNodeVo; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.mapper.ApproveNodeMapper; import com.ruoyi.approve.mapper.ApproveProcessConfigNodeMapper; import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.pojo.ApproveProcessConfigNode; import com.ruoyi.approve.service.ApproveProcessConfigNodeService; import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.utils.DailyRedisCounter; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; @@ -32,63 +35,50 @@ import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.*; import java.util.stream.Collectors; @Service //@RequiredArgsConstructor @RequiredArgsConstructor public class ApproveProcessServiceImpl extends ServiceImpl<ApproveProcessMapper, ApproveProcess> implements IApproveProcessService { private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); @Autowired private StringRedisTemplate redisTemplate; @Autowired private DailyRedisCounter dailyRedisCounter; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private IApproveNodeService approveNodeService; @Autowired private SysUserMapper sysUserMapper; @Autowired private ApproveProcessMapper approveProcessMapper; @Autowired private TempFileServiceImpl tempFileService; @Autowired private CommonFileMapper commonFileMapper; @Autowired private CommonFileServiceImpl commonFileService; @Autowired private ISysNoticeService sysNoticeService; private final SysDeptMapper sysDeptMapper; private final IApproveNodeService approveNodeService; private final SysUserMapper sysUserMapper; private final ApproveProcessMapper approveProcessMapper; private final TempFileServiceImpl tempFileService; private final CommonFileMapper commonFileMapper; private final CommonFileServiceImpl commonFileService; private final ISysNoticeService sysNoticeService; private final PurchaseLedgerMapper purchaseLedgerMapper; private final ShippingInfoMapper shippingInfoMapper; private final ApproveNodeMapper approveNodeMapper; private final ApproveProcessConfigNodeService approveProcessConfigNodeService; private final ApproveProcessConfigNodeMapper approveProcessConfigNodeMapper; @Override public void addApprove(ApproveProcessVO approveProcessVO) throws Exception { SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser()); SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId()); String[] split = approveProcessVO.getApproveUserIds().split(","); List<Long> longList = Arrays.stream(split) .map(Long::valueOf) // å°æ¯ä¸ª String 转æ¢ä¸º Long SysUser sysUser = SecurityUtils.getLoginUser().getUser(); SysDept sysDept = sysDeptMapper.selectDeptById(SecurityUtils.getLoginUser().getCurrentDeptId()); List<ApproveProcessConfigNodeVo> list = approveProcessConfigNodeService.listNode(approveProcessVO.getApproveType()); List<Long> nodeIds = list.stream() .map(ApproveProcessConfigNodeVo::getApproverId) .collect(Collectors.toList()); List<SysUser> sysUsers = sysUserMapper.selectUserByIds(longList); if (list.isEmpty()) { throw new RuntimeException("æµç¨ä¸åå¨"); } List<SysUser> sysUsers = sysUserMapper.selectUserByIds(nodeIds); if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("å®¡æ ¸ç¨æ·ä¸åå¨"); if (sysDept == null) throw new RuntimeException("é¨é¨ä¸åå¨"); if (sysUser == null) throw new RuntimeException("ç³è¯·äººä¸åå¨"); @@ -99,16 +89,18 @@ // String approveID = today + formattedCount; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); ApproveProcess approveProcess = new ApproveProcess(); String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "","approve_id"); String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id"); approveProcess.setApproveId(no); approveProcess.setApproveUser(approveProcessVO.getApproveUser()); approveProcess.setApproveUser(sysUser.getUserId()); approveProcess.setApproveUserName(sysUser.getNickName()); approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); approveProcess.setApproveDeptId(sysDept.getDeptId()); approveProcess.setApproveUserIds(nodeIds.stream().map(String::valueOf).collect(Collectors.joining(","))); approveProcess.setApproveDeptName(sysDept.getDeptName()); approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(","))); approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime())); approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? new Date() : dateFormat.parse(approveProcessVO.getApproveTime())); approveProcess.setApproveReason(approveProcessVO.getApproveReason()); approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId()); approveProcess.setRecordId(approveProcessVO.getRecordId()); approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice()); approveProcess.setPrice(approveProcessVO.getPrice()); approveProcess.setStartDate(approveProcessVO.getStartDate()); @@ -118,11 +110,10 @@ approveProcess.setApproveType(approveProcessVO.getApproveType()); approveProcess.setCreateTime(LocalDateTime.now()); approveProcess.setTenantId(approveProcessVO.getApproveDeptId()); approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds()); approveProcess.setApproveUserCurrentId(longList.get(0)); approveProcess.setApproveUserCurrentId(nodeIds.get(0)); approveProcess.setApproveUserCurrentName(sysUsers .stream() .filter(SysUser -> SysUser.getUserId().equals(longList.get(0))) .filter(SysUser -> SysUser.getUserId().equals(nodeIds.get(0))) .collect(Collectors.toList()) .get(0) .getNickName()); @@ -134,20 +125,23 @@ } save(approveProcess); //åå§å审æ¹èç¹ approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(), no, approveProcessVO.getApproveDeptId()); String nodeIdStr = nodeIds.stream() .map(String::valueOf) .collect(Collectors.joining(",")); approveNodeService.initApproveNodes(nodeIdStr, no, approveProcessVO.getApproveDeptId()); // éä»¶ç»å® tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue()); /*æ¶æ¯éç¥*/ String id = approveProcessVO.getApproveUserIds().split(",")[0]; if (approveProcess.getApproveType()==8){ Long id = nodeIds.get(0); if (approveProcess.getApproveType() == 8) { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), Collections.singletonList(id), "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); }else { } else { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), Collections.singletonList(id), "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); } } @@ -161,12 +155,6 @@ } return sysDeptList; } @Autowired private PurchaseLedgerMapper purchaseLedgerMapper; @Autowired private ShippingInfoMapper shippingInfoMapper; @Override public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) { @@ -287,9 +275,9 @@ // å é¤å¯¹åºçæ¶æ¯éç¥ sysNoticeService.remove(new LambdaQueryWrapper<SysNotice>() .eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType())) .eq(SysNotice::getSenderId, latestProcess.getApproveUser()) .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId())); .eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType())) .eq(SysNotice::getSenderId, latestProcess.getApproveUser()) .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId())); } } @@ -297,16 +285,14 @@ @Override public ApproveProcess getApproveById(String id) { ApproveProcess one = approveProcessMapper.selectList(Wrappers.<ApproveProcess>lambdaQuery() .eq(ApproveProcess::getApproveId,id) .eq(ApproveProcess::getApproveDelete,0)).get(0); .eq(ApproveProcess::getApproveId, id) .eq(ApproveProcess::getApproveDelete, 0)).get(0); one.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() .eq(CommonFile::getCommonId, one.getId()) .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue()))); return one; } @Autowired private ApproveNodeMapper approveNodeMapper; // æ¥ä»·å®¡æ¹ç¼è¾å®¡æ ¸äºº public void updateApproveUser(ApproveGetAndUpdateVo approveGetAndUpdateVo) { @@ -315,17 +301,20 @@ .eq(ApproveProcess::getApproveReason, approveGetAndUpdateVo.getApproveReason()) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if (approveProcess == null) throw new RuntimeException("è¯·éæ©å®¡æ¹äºº"); String[] split = approveGetAndUpdateVo.getApproveUserIds().split(","); if (split.length == 0) { throw new RuntimeException("è¯·éæ©å®¡æ¹äºº"); } List<SysUser> sysUsers = sysUserMapper.selectUserByIds(Arrays.asList(split).stream().map(Long::parseLong).collect(Collectors.toList())); //æ¥è¯¢å®¡æ¹é ç½® List<ApproveProcessConfigNode> approveProcessConfig = approveProcessConfigNodeMapper.selectList(new LambdaQueryWrapper<ApproveProcessConfigNode>().eq(ApproveProcessConfigNode::getApproveType, approveGetAndUpdateVo.getApproveType())); List<Long> configNodeIds = approveProcessConfig.stream() .sorted(Comparator.comparing(ApproveProcessConfigNode::getNodeOrder)) .map(ApproveProcessConfigNode::getApproverId) .collect(Collectors.toList()); List<SysUser> sysUsers = sysUserMapper.selectUserByIds(configNodeIds); if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("è¯·éæ©å®¡æ¹äºº"); //å®¡æ ¸ä¸ä¸å¯ä»¥ç¼è¾å®¡æ ¸äºº if (approveProcess.getApproveStatus() != 1) { approveProcess.setApproveUserCurrentId(Long.parseLong(split[0])); approveProcess.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[0]))).collect(Collectors.toList()).get(0).getNickName()); approveProcess.setApproveUserCurrentId(configNodeIds.get(0)); approveProcess.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(configNodeIds.get(0))).collect(Collectors.toList()).get(0).getNickName()); } if (approveGetAndUpdateVo.getApproveStatus() != null) { approveProcess.setApproveStatus(approveGetAndUpdateVo.getApproveStatus()); @@ -337,21 +326,24 @@ LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveProcess.getApproveId()) .eq(ApproveNode::getDeleteFlag, 0) // .eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId()) .orderByAsc(ApproveNode::getApproveNodeOrder); approveNodeMapper.delete(approveNodeLambdaQueryWrapper); //æ¥è¯¢å®¡æ¹é ç½® approveGetAndUpdateVo.setApproveUserIds(configNodeIds.stream() .map(String::valueOf) .collect(Collectors.joining(","))); approveNodeService.initApproveNodes(approveGetAndUpdateVo.getApproveUserIds(), approveProcess.getApproveId(), approveProcess.getTenantId()); /*æ¶æ¯éç¥*/ String id = approveProcess.getApproveUserIds().split(",")[0]; if (approveProcess.getApproveType()==8){ Long id = configNodeIds.get(0); if (approveProcess.getApproveType() == 8) { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), Collections.singletonList(id), "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); }else { } else { sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()), approveProcess.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), Collections.singletonList(id), "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId()); } } @@ -408,12 +400,12 @@ tempFileService.migrateTempFilesToFormal(approve.getId(), approveGetAndUpdateVo.getTempFileIds(), FileNameType.ApproveProcess.getValue()); /*æ¶æ¯éç¥*/ String id = approve.getApproveUserIds().split(",")[0]; if (approve.getApproveType()==8){ if (approve.getApproveType() == 8) { sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()), approve.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), "/safeProduction/safeWorkApproval?approveType=" + approve.getApproveType() + "&approveId=" + approve.getApproveId()); }else { } else { sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()), approve.getApproveId() + "æµç¨ç¼å·ç审æ¹éè¦æ¨å®¡æ ¸!!!!!", Arrays.asList(Long.valueOf(id)), @@ -442,6 +434,8 @@ return "å货审æ¹"; case 8: return "å±é©ä½ä¸å®¡æ¹"; case 9: return "éå®å®¡æ¹"; } return null; } src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.approve.utils; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class ApproveProcessConfigNodeUtils { } src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -20,7 +20,7 @@ /** * èªå®ä¹éåºå¤çç±» è¿åæå * * * @author ruoyi */ @Configuration @@ -31,7 +31,7 @@ /** * éåºå¤ç * * * @return */ @Override src/main/java/com/ruoyi/projectManagement/service/impl/InfoServiceImpl.java
@@ -24,7 +24,6 @@ import lombok.SneakyThrows; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -57,7 +56,7 @@ contractInfoHandleService.save(infoId, saveInfoVo.getContractInfo()); } if(saveInfoVo.getSalesLedgerProductList() != null){ salesLedgerService.handleSalesLedgerProducts(infoId, saveInfoVo.getSalesLedgerProductList(), SaleEnum.MANAGEMENT); salesLedgerService.handleSalesLedgerProducts(infoId, saveInfoVo.getSalesLedgerProductList(), SaleEnum.MANAGEMENT,""); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -13,7 +13,7 @@ import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.mapper.SupplierManageMapper; @@ -171,15 +171,23 @@ @Override @Transactional(rollbackFor = Exception.class) public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception { PurchaseLedger purchaseLedger = new PurchaseLedger(); SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId()); //å½å ¥äºº SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId()); if (ObjectUtils.isNotEmpty(sysUser)) { purchaseLedger.setRecorderName(sysUser.getNickName()); purchaseLedger.setPhoneNumber(sysUser.getPhonenumber()); }else { purchaseLedger.setRecorderName(SecurityUtils.getLoginUser().getNickName()); SysUser sysUser1 = userMapper.selectUserById(SecurityUtils.getUserId()); purchaseLedger.setPhoneNumber(sysUser1.getPhonenumber()); } SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId()); // DTO转Entity PurchaseLedger purchaseLedger = new PurchaseLedger(); BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger); LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) { @@ -189,8 +197,7 @@ purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1); purchaseLedger.setSupplierName(supplierManage.getSupplierName()); purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); purchaseLedger.setRecorderName(sysUser.getNickName()); purchaseLedger.setPhoneNumber(sysUser.getPhonenumber()); purchaseLedger.setApprovalStatus(1); // 3. æ°å¢ææ´æ°ä¸»è¡¨ if (purchaseLedger.getId() == null) { src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -1,13 +1,15 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.SalesQuotationDto; import com.ruoyi.sales.service.SalesQuotationService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -45,6 +47,7 @@ return AjaxResult.success(salesQuotationService.add(salesQuotationDto)); } @PostMapping("/update") @Log(title = "æ¥ä»·æ´æ°", businessType = BusinessType.UPDATE) public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) { return AjaxResult.success(salesQuotationService.edit(salesQuotationDto)); } src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -1,12 +1,9 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -15,22 +12,14 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.other.service.impl.TempFileServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.ShippingInfoDto; import com.ruoyi.sales.mapper.ShipmentApprovalMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.ShipmentApproval; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import com.ruoyi.sales.service.ShippingInfoService; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.aftersalesservice.pojo.AfterSalesService; import com.ruoyi.common.enums.SaleEnum; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.LossProductModelDto; @@ -35,7 +34,7 @@ List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(@NotNull Long relateId,@NotNull SaleEnum type); List<SalesLedgerProduct> getSalesLedgerProductListByIds(@Nullable List<Long> relateIds, @NotNull SaleEnum type); void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type); void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type,String contractNo); SalesLedgerDto getSalesLedgerWithProducts(SalesLedgerDto salesLedgerDto); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -81,7 +81,6 @@ private ProductionProductInputMapper productionProductInputMapper; private QualityInspectMapper qualityInspectMapper; private ShippingInfoMapper shippingInfoMapper; private ShippingInfoServiceImpl shippingInfoService; private StockUtils stockUtils; @@ -167,7 +166,7 @@ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids))); if (!CollectionUtils.isEmpty(shippingInfos)) { shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); shippingInfoMapper.deleteBatchIds(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); } // å¯è½å±äºå¤ä¸ªä¸»è¡¨ src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,8 +9,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.enums.FileNameType; @@ -25,7 +26,6 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.production.mapper.*; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; @@ -33,7 +33,6 @@ import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.SimpleReturnOrderGroupDto; import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.sales.dto.*; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; @@ -43,7 +42,6 @@ import org.apache.commons.io.FilenameUtils; import org.jetbrains.annotations.Nullable; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; @@ -94,40 +92,17 @@ private final CommonFileServiceImpl commonFileService; private final ShippingInfoMapper shippingInfoMapper; private final InvoiceLedgerMapper invoiceLedgerMapper; private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper; private final SalesLedgerWorkMapper salesLedgerWorkMapper; private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; private final InvoiceRegistrationMapper invoiceRegistrationMapper; private final ProductOrderMapper productOrderMapper; private final ProcessRouteMapper processRouteMapper; private final ProductProcessRouteMapper productProcessRouteMapper; private final ProcessRouteItemMapper processRouteItemMapper; private final ProductProcessRouteItemMapper productProcessRouteItemMapper; private final ProductWorkOrderMapper productWorkOrderMapper; private final ProductionProductMainMapper productionProductMainMapper; private final ProductionProductOutputMapper productionProductOutputMapper; private final ProductionProductInputMapper productionProductInputMapper; private final QualityInspectMapper qualityInspectMapper; private final RedisTemplate<String, String> redisTemplate; @Autowired private SysDeptMapper sysDeptMapper; private final IApproveProcessService approveProcessService; private final SysDeptMapper sysDeptMapper; @Value("${file.upload-dir}") private String uploadDir; @Autowired private ProductModelMapper productModelMapper; @Autowired private ProductMapper productMapper; @Autowired private ProductStructureMapper productStructureMapper; @Autowired private ProductionProductMainService productionProductMainService; @Autowired private PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper; ; @Autowired private SysUserMapper sysUserMapper; private final ProductModelMapper productModelMapper; private final ProductionProductMainService productionProductMainService; private final PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper; private final SysUserMapper sysUserMapper; @Override public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) { @@ -154,7 +129,7 @@ // æ¥è¯¢éè´§ä¿¡æ¯ List<Long> productIds = salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()); List<SimpleReturnOrderGroupDto> groupListByProductIds = new ArrayList<>(); if(CollectionUtils.isNotEmpty(productIds)){ if (CollectionUtils.isNotEmpty(productIds)) { groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds); } Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getSalesLedgerProductId, SimpleReturnOrderGroupDto::getSumReturnQuantity)); @@ -615,7 +590,7 @@ // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType())); handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()), salesLedger.getSalesContractNo()); updateMainContractAmount( salesLedger.getId(), productList, @@ -713,7 +688,7 @@ // æä»¶è¿ç§»æ¹æ³ @Override public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) { public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type, String contractNo) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) @@ -737,8 +712,22 @@ salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); //æ·»å éå®å®¡æ¹ å®¡æ¹æåä¹åæ·»å çäº§æ°æ® ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(9); approveProcessVO.setApproveDeptId(SecurityUtils.getDeptId()[0]); approveProcessVO.setApproveReason(contractNo); approveProcessVO.setRecordId(salesLedgerProduct.getId()); approveProcessVO.setApproveUser(SecurityUtils.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); approveProcessVO.setApproveId(salesLedgerProduct.getId().toString()); try { approveProcessService.addApprove(approveProcessVO); }catch (Exception e) { log.error("æ·»å éå®å®¡æ¹å¼å¸¸", e); } // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); // salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } } src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -8,8 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; @@ -113,11 +112,22 @@ public boolean edit(SalesQuotationDto salesQuotationDto) { SalesQuotation salesQuotation = new SalesQuotation(); BeanUtils.copyProperties(salesQuotationDto, salesQuotation); ApproveGetAndUpdateVo vo = new ApproveGetAndUpdateVo(); if ("æç»".equals(salesQuotationDto.getStatus())) { vo.setApproveStatus(0); salesQuotation.setStatus("å¾ å®¡æ¹"); } // if ("æç»".equals(salesQuotationDto.getStatus())) { // vo.setApproveStatus(0); // salesQuotation.setStatus("å¾ å®¡æ¹"); // } //ç¼è¾å°å®¡æ¹æ¹ä¸ºå¾ å®¡æ¹ salesQuotation.setStatus("å¾ å®¡æ¹"); //å°ä¹åæªå®¡æ¹çç»æ LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveType, 6) .eq(ApproveProcess::getApproveReason, salesQuotationDto.getQuotationNo()); List<ApproveProcess> approveProcesss = approveProcessService.list(approveProcessLambdaQueryWrapper); approveProcesss.forEach(approveProcess -> { approveProcess.setApproveStatus(4); }); approveProcessService.updateBatchById(approveProcesss); if (salesQuotationMapper.updateById(salesQuotation) != 1) { return false; } @@ -134,10 +144,19 @@ salesQuotationProductService.saveBatch(products); // ä¿®æ¹æ¥ä»·å®¡æ¹ vo.setApproveUserIds(salesQuotationDto.getApproveUserIds()); vo.setApproveType(6); vo.setApproveReason(salesQuotationDto.getQuotationNo()); approveProcessService.updateApproveUser(vo); ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(6); approveProcessVO.setApproveDeptId(SecurityUtils.getLoginUser().getCurrentDeptId()); approveProcessVO.setApproveReason(salesQuotation.getQuotationNo()); approveProcessVO.setApproveUserIds(salesQuotationDto.getApproveUserIds()); approveProcessVO.setApproveUser(SecurityUtils.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); approveProcessVO.setPrice(salesQuotationDto.getTotalAmount()); try { approveProcessService.addApprove(approveProcessVO); }catch (Exception e){ log.error("SalesQuotationServiceImpl error:{}", e); } return true; } src/main/resources/application-dev.yml
@@ -74,9 +74,9 @@ druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://localhost:3306/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://localhost:3300/product-inventory-management-jghg?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 password: root # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é @@ -154,7 +154,7 @@ database: 0 # å¯ç # password: root2022! password: password: 123456 # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s src/main/resources/mapper/approve/ApproveProcessConfigNodeMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ <?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.ruoyi.approve.mapper.ApproveProcessConfigNodeMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveProcessConfigNode"> <id column="id" property="id" /> <result column="node_order" property="nodeOrder" /> <result column="approver_type" property="approverType" /> <result column="is_required" property="isRequired" /> <result column="timeout_hours" property="timeoutHours" /> <result column="tenant_id" property="tenantId" /> <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> <result column="update_user" property="updateUser" /> <result column="update_time" property="updateTime" /> <result column="delete_flag" property="deleteFlag" /> <result column="dept_id" property="deptId" /> </resultMap> </mapper> src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -28,15 +28,19 @@ approve_delete,tenant_id,approve_type,approve_remark </sql> <select id="listPage" resultType="com.ruoyi.approve.pojo.ApproveProcess"> select * from approve_process where approve_delete = 0 <if test="req.approveId != null and req.approveId != ''"> and approve_id like concat('%',#{req.approveId},'%') </if> <if test="req.approveStatus != null or req.approveStatus == 0"> and approve_status = #{req.approveStatus} </if> <if test="req.approveType != null "> and approve_type = #{req.approveType} </if> select * from approve_process <where> approve_delete = 0 <if test="req.approveId != null and req.approveId != ''"> and approve_id like concat('%',#{req.approveId},'%') </if> <if test="req.approveStatus != null or req.approveStatus == 0"> and approve_status = #{req.approveStatus} </if> <if test="req.approveType != null "> and approve_type = #{req.approveType} </if> </where> order by approve_process.create_time desc </select> </mapper> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -10,7 +10,7 @@ WHERE sales_contract_no LIKE CONCAT('%',#{datePart},'%') </select> <select id="getSalesNo" resultType="com.ruoyi.sales.pojo.SalesLedger"> </select> <select id="selectSalesLedgerList" resultType="com.ruoyi.sales.pojo.SalesLedger"> src/main/resources/mapper/sales/SalesQuotationMapper.xml
@@ -7,8 +7,9 @@ SELECT t1.*, t2.approve_user_ids FROM sales_quotation t1 LEFT JOIN approve_process t2 ON t1.quotation_no = t2.approve_reason and t2.approve_type = 6 LEFT JOIN approve_process t2 ON t1.quotation_no = t2.approve_reason and t2.approve_type = 6 and t2.approve_status = 0 WHERE 1=1 and t2.approve_deleted = 0 <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' "> AND t1.quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%') </if>