Browse Source

Merge remote-tracking branch 'origin/dev' into dev

dev
zhangsiqi 4 months ago
parent
commit
f0fb36a30e
  1. 35
      ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java
  2. 317
      ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SalesAftersalesNoticeDetail.java
  3. 77
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java
  4. 75
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeDetailService.java
  5. 6
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeService.java
  6. 126
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeDetailServiceImpl.java
  7. 40
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java
  8. 124
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/BaseEmpRequisiteOrderController.java
  9. 23
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysSalesOrderController.java
  10. 2
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/BaseEmpRequisiteOrderChild.java
  11. 12
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysSalesOrder.java
  12. 33
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/Vo/BaseEmpRequisiteOrderVO.java
  13. 88
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/Vo/SelectAftersalesNoticeVO.java
  14. 8
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/BaseEmpRequisiteOrderChildMapper.java
  15. 15
      ruoyi-admin/src/main/java/com/ruoyi/system/mapper/BaseEmpRequisiteOrderMapper.java
  16. 22
      ruoyi-admin/src/main/java/com/ruoyi/system/service/IBaseEmpRequisiteOrderService.java
  17. 236
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseEmpRequisiteOrderServiceImpl.java
  18. 160
      ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml
  19. 13
      ruoyi-admin/src/main/resources/mapper/system/BaseEmpRequisiteOrderChildMapper.xml
  20. 44
      ruoyi-admin/src/main/resources/mapper/system/BaseEmpRequisiteOrderMapper.xml
  21. 1
      ruoyi-admin/src/main/resources/mapper/system/OutsourceQuoteMapper.xml
  22. 2
      ruoyi-admin/src/main/resources/mapper/system/SysSalesOrderChildMapper.xml
  23. 63
      ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/add.html
  24. 1
      ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/detail.html
  25. 18
      ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/empRequisiteOrder.html
  26. 153
      ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/taskScjlVerify.html
  27. 151
      ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/taskSczgVerify.html
  28. 18
      ruoyi-admin/src/main/resources/templates/system/salesOrder/salesOrder.html
  29. 283
      ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersales.html
  30. 86
      ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersalesMaterialSelect.html

35
ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java

@ -5,7 +5,11 @@ import java.util.List;
import com.ruoyi.aftersales.service.IAftersalesOrderService;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.quality.domain.VO.CheckoutMaterialVO;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.system.domain.SysSalesOrder;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import com.ruoyi.system.service.ISysSalesOrderService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
@ -55,6 +59,9 @@ public class SalesAftersalesNoticeController extends BaseController
@Autowired
private IAftersalesOrderService aftersalesOrderService;
@Autowired
private ISysSalesOrderService sysSalesOrderService;
@RequiresPermissions("sales:afterSalesNotice:view")
@GetMapping()
@ -115,6 +122,34 @@ public class SalesAftersalesNoticeController extends BaseController
}
/**
* 修改保存发起售后
*/
@RequiresPermissions("sales:afterSalesNotice:startAftersales")
@Log(title = "销售售后通知", businessType = BusinessType.UPDATE)
@PostMapping("/startAftersales")
@ResponseBody
public AjaxResult startAftersalesSave(@RequestBody SysSalesOrder sysSalesOrder)
{
return AjaxResult.success();
}
/**
* 查找与销售订单号有关的物料信息
* */
@ResponseBody
@PostMapping("/getMaterialInfoBySalesOrderCode")
public TableDataInfo getMaterialInfoBySalesOrderCode(@RequestParam String salesOrderCode){
startPage();
List<SelectAftersalesNoticeVO> list = salesAftersalesNoticeService.selectMaterialInfoBySalesOrderCode(salesOrderCode);
return getDataTable(list);
}
/**
* 加载审批弹窗

317
ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SalesAftersalesNoticeDetail.java

@ -0,0 +1,317 @@
package com.ruoyi.sales.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 售后通知单详情对象 sales_aftersales_notice_detail
*
* @author 刘晓旭
* @date 2024-07-22
*/
public class SalesAftersalesNoticeDetail extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 售后通知单详情ID */
private Long aftersalesNoticeDetailId;
/** 售后通知单号 */
@Excel(name = "售后通知单号")
private String aftersalesNoticeCode;
/** 关联生产订单号 */
private String makeNo;
/** 关联销售订单编号 */
private String salesOrderCode;
/** 用户ID */
private Long userId;
/** 紧急程度(0一般、1紧急) */
@Excel(name = "紧急程度", readConverterExp = "0=一般、1紧急")
private String emergencyDegree;
/** 售后问题 */
@Excel(name = "售后问题")
private String aftersalesProblem;
/** 报告问题 */
@Excel(name = "报告问题")
private String aftersalesReportUrl;
/** 客户ID */
private String customerId;
/** 客户名称 */
private String customerName;
/** SN号(产品序列号) */
@Excel(name = "SN号", readConverterExp = "产=品序列号")
private String snCode;
/** 设备流水号 */
@Excel(name = "设备流水号")
private String deviceRunningNumber;
/** 物料名称 */
@Excel(name = "物料名称")
private String materialName;
/** 物料类型 */
@Excel(name = "物料类型")
private String materialType;
/** 物料图片地址 */
@Excel(name = "物料图片地址")
private String materialPhotourl;
/** 料号 */
@Excel(name = "料号")
private String materialNo;
/** 物料品牌 */
@Excel(name = "物料品牌")
private String materialBrand;
/** 物料单位 */
@Excel(name = "物料单位")
private String materialUnit;
/** 物料描述 */
@Excel(name = "物料描述")
private String materialDescribe;
/** 物料加工方式 */
@Excel(name = "物料加工方式")
private String materialProcessMethod;
/** 已出库数量 */
@Excel(name = "已出库数量")
private Integer shippedGoodsSum;
public void setAftersalesNoticeDetailId(Long aftersalesNoticeDetailId)
{
this.aftersalesNoticeDetailId = aftersalesNoticeDetailId;
}
public Long getAftersalesNoticeDetailId()
{
return aftersalesNoticeDetailId;
}
public void setAftersalesNoticeCode(String aftersalesNoticeCode)
{
this.aftersalesNoticeCode = aftersalesNoticeCode;
}
public String getAftersalesNoticeCode()
{
return aftersalesNoticeCode;
}
public void setMakeNo(String makeNo)
{
this.makeNo = makeNo;
}
public String getMakeNo()
{
return makeNo;
}
public void setSalesOrderCode(String salesOrderCode)
{
this.salesOrderCode = salesOrderCode;
}
public String getSalesOrderCode()
{
return salesOrderCode;
}
public void setUserId(Long userId)
{
this.userId = userId;
}
public Long getUserId()
{
return userId;
}
public void setEmergencyDegree(String emergencyDegree)
{
this.emergencyDegree = emergencyDegree;
}
public String getEmergencyDegree()
{
return emergencyDegree;
}
public void setAftersalesProblem(String aftersalesProblem)
{
this.aftersalesProblem = aftersalesProblem;
}
public String getAftersalesProblem()
{
return aftersalesProblem;
}
public void setAftersalesReportUrl(String aftersalesReportUrl)
{
this.aftersalesReportUrl = aftersalesReportUrl;
}
public String getAftersalesReportUrl()
{
return aftersalesReportUrl;
}
public void setCustomerId(String customerId)
{
this.customerId = customerId;
}
public String getCustomerId()
{
return customerId;
}
public void setCustomerName(String customerName)
{
this.customerName = customerName;
}
public String getCustomerName()
{
return customerName;
}
public void setSnCode(String snCode)
{
this.snCode = snCode;
}
public String getSnCode()
{
return snCode;
}
public void setDeviceRunningNumber(String deviceRunningNumber)
{
this.deviceRunningNumber = deviceRunningNumber;
}
public String getDeviceRunningNumber()
{
return deviceRunningNumber;
}
public void setMaterialName(String materialName)
{
this.materialName = materialName;
}
public String getMaterialName()
{
return materialName;
}
public void setMaterialType(String materialType)
{
this.materialType = materialType;
}
public String getMaterialType()
{
return materialType;
}
public void setMaterialPhotourl(String materialPhotourl)
{
this.materialPhotourl = materialPhotourl;
}
public String getMaterialPhotourl()
{
return materialPhotourl;
}
public void setMaterialNo(String materialNo)
{
this.materialNo = materialNo;
}
public String getMaterialNo()
{
return materialNo;
}
public void setMaterialBrand(String materialBrand)
{
this.materialBrand = materialBrand;
}
public String getMaterialBrand()
{
return materialBrand;
}
public void setMaterialUnit(String materialUnit)
{
this.materialUnit = materialUnit;
}
public String getMaterialUnit()
{
return materialUnit;
}
public void setMaterialDescribe(String materialDescribe)
{
this.materialDescribe = materialDescribe;
}
public String getMaterialDescribe()
{
return materialDescribe;
}
public void setMaterialProcessMethod(String materialProcessMethod)
{
this.materialProcessMethod = materialProcessMethod;
}
public String getMaterialProcessMethod()
{
return materialProcessMethod;
}
public void setShippedGoodsSum(Integer shippedGoodsSum)
{
this.shippedGoodsSum = shippedGoodsSum;
}
public Integer getShippedGoodsSum()
{
return shippedGoodsSum;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("aftersalesNoticeDetailId", getAftersalesNoticeDetailId())
.append("aftersalesNoticeCode", getAftersalesNoticeCode())
.append("makeNo", getMakeNo())
.append("salesOrderCode", getSalesOrderCode())
.append("userId", getUserId())
.append("emergencyDegree", getEmergencyDegree())
.append("aftersalesProblem", getAftersalesProblem())
.append("aftersalesReportUrl", getAftersalesReportUrl())
.append("customerId", getCustomerId())
.append("customerName", getCustomerName())
.append("snCode", getSnCode())
.append("deviceRunningNumber", getDeviceRunningNumber())
.append("materialName", getMaterialName())
.append("materialType", getMaterialType())
.append("materialPhotourl", getMaterialPhotourl())
.append("materialNo", getMaterialNo())
.append("materialBrand", getMaterialBrand())
.append("materialUnit", getMaterialUnit())
.append("materialDescribe", getMaterialDescribe())
.append("materialProcessMethod", getMaterialProcessMethod())
.append("shippedGoodsSum", getShippedGoodsSum())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

77
ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java

@ -0,0 +1,77 @@
package com.ruoyi.sales.mapper;
import java.util.List;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
/**
* 售后通知单详情Mapper接口
*
* @author 刘晓旭
* @date 2024-07-22
*/
public interface SalesAftersalesNoticeDetailMapper
{
/**
* 查询售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 售后通知单详情
*/
public SalesAftersalesNoticeDetail selectSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 查询售后通知单详情列表
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 售后通知单详情集合
*/
public List<SalesAftersalesNoticeDetail> selectSalesAftersalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 新增售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
public int insertSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 修改售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
public int updateSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 删除售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
public int deleteSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 批量删除售后通知单详情
*
* @param aftersalesNoticeDetailIds 需要删除的数据ID
* @return 结果
*/
public int deleteSalesAftersalesNoticeDetailByIds(String[] aftersalesNoticeDetailIds);
/**
* 作废售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
public int cancelSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 恢复售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
public int restoreSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
}

75
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeDetailService.java

@ -0,0 +1,75 @@
package com.ruoyi.sales.service;
import java.util.List;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
/**
* 售后通知单详情Service接口
*
* @author 刘晓旭
* @date 2024-07-22
*/
public interface ISalesAftersalesNoticeDetailService
{
/**
* 查询售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 售后通知单详情
*/
public SalesAftersalesNoticeDetail selectSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 查询售后通知单详情列表
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 售后通知单详情集合
*/
public List<SalesAftersalesNoticeDetail> selectSalesAftersalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 新增售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
public int insertSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 修改售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
public int updateSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
/**
* 批量删除售后通知单详情
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteSalesAftersalesNoticeDetailByIds(String ids);
/**
* 删除售后通知单详情信息
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
public int deleteSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 作废售后通知单详情
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return
*/
int cancelSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 恢复售后通知单详情
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return
*/
int restoreSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
}

6
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeService.java

@ -5,6 +5,7 @@ import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesOrder;
import com.ruoyi.sales.domain.SalesAftersalesNotice;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import org.activiti.engine.runtime.ProcessInstance;
/**
@ -88,4 +89,9 @@ public interface ISalesAftersalesNoticeService
* 根据售后单号查询销售售后通知单
* */
SalesAftersalesNoticeVO selectSalesAftersalesNoticeByCode(String aftersalesNoticeCode);
/**
* 根据销售单号查询售后通知单Vo类
* */
List<SelectAftersalesNoticeVO> selectMaterialInfoBySalesOrderCode(String salesOrderCode);
}

126
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeDetailServiceImpl.java

@ -0,0 +1,126 @@
package com.ruoyi.sales.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sales.mapper.SalesAftersalesNoticeDetailMapper;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
import com.ruoyi.sales.service.ISalesAftersalesNoticeDetailService;
import com.ruoyi.common.core.text.Convert;
/**
* 售后通知单详情Service业务层处理
*
* @author 刘晓旭
* @date 2024-07-22
*/
@Service
public class SalesAftersalesNoticeDetailServiceImpl implements ISalesAftersalesNoticeDetailService
{
@Autowired
private SalesAftersalesNoticeDetailMapper salesAftersalesNoticeDetailMapper;
/**
* 查询售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 售后通知单详情
*/
@Override
public SalesAftersalesNoticeDetail selectSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId)
{
return salesAftersalesNoticeDetailMapper.selectSalesAftersalesNoticeDetailById(aftersalesNoticeDetailId);
}
/**
* 查询售后通知单详情列表
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 售后通知单详情
*/
@Override
public List<SalesAftersalesNoticeDetail> selectSalesAftersalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail)
{
return salesAftersalesNoticeDetailMapper.selectSalesAftersalesNoticeDetailList(salesAftersalesNoticeDetail);
}
/**
* 新增售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
@Override
public int insertSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail)
{
String loginName = ShiroUtils.getLoginName();
salesAftersalesNoticeDetail.setCreateBy(loginName);
salesAftersalesNoticeDetail.setCreateTime(DateUtils.getNowDate());
return salesAftersalesNoticeDetailMapper.insertSalesAftersalesNoticeDetail(salesAftersalesNoticeDetail);
}
/**
* 修改售后通知单详情
*
* @param salesAftersalesNoticeDetail 售后通知单详情
* @return 结果
*/
@Override
public int updateSalesAftersalesNoticeDetail(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail)
{
String loginName = ShiroUtils.getLoginName();
salesAftersalesNoticeDetail.setUpdateBy(loginName);
salesAftersalesNoticeDetail.setUpdateTime(DateUtils.getNowDate());
return salesAftersalesNoticeDetailMapper.updateSalesAftersalesNoticeDetail(salesAftersalesNoticeDetail);
}
/**
* 删除售后通知单详情对象
*
* @param ids 需要删除的数据ID
* @return 结果
*/
@Override
public int deleteSalesAftersalesNoticeDetailByIds(String ids)
{
return salesAftersalesNoticeDetailMapper.deleteSalesAftersalesNoticeDetailByIds(Convert.toStrArray(ids));
}
/**
* 删除售后通知单详情信息
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
@Override
public int deleteSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId)
{
return salesAftersalesNoticeDetailMapper.deleteSalesAftersalesNoticeDetailById(aftersalesNoticeDetailId);
}
/**
* 作废售后通知单详情
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
@Override
public int cancelSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId)
{
return salesAftersalesNoticeDetailMapper.cancelSalesAftersalesNoticeDetailById(aftersalesNoticeDetailId);
}
/**
* 恢复售后通知单详情信息
*
* @param aftersalesNoticeDetailId 售后通知单详情ID
* @return 结果
*/
@Override
public int restoreSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId)
{
return salesAftersalesNoticeDetailMapper.restoreSalesAftersalesNoticeDetailById(aftersalesNoticeDetailId);
}
}

40
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java

@ -1,9 +1,6 @@
package com.ruoyi.sales.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import com.github.pagehelper.Page;
import com.ruoyi.common.core.domain.entity.SysUser;
@ -16,8 +13,12 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.system.domain.SysSalesOrderChild;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import com.ruoyi.system.mapper.SysSalesOrderChildMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysRoleService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.persistence.entity.TaskEntityImpl;
import org.activiti.engine.runtime.ProcessInstance;
@ -29,6 +30,7 @@ import com.ruoyi.sales.domain.SalesAftersalesNotice;
import com.ruoyi.sales.service.ISalesAftersalesNoticeService;
import com.ruoyi.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
/**
* 售后通知单Service业务层处理
@ -36,6 +38,8 @@ import org.springframework.transaction.annotation.Transactional;
* @author 刘晓旭
* @date 2024-04-15
*/
@Slf4j
@Service
public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeService
{
@ -60,6 +64,8 @@ public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeS
@Autowired
private BizTodoItemMapper todoItemMapper;
@Autowired
private SysSalesOrderChildMapper sysSalesOrderChildMapper;
/**
* 查询售后通知单
@ -251,6 +257,32 @@ public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeS
return salesAftersalesNoticeMapper.selectSalesAftersalesNoticeByCode(aftersalesNoticeCode);
}
/**
* 根据销售单号查询售后通知单Vo类
* */
@Override
public List<SelectAftersalesNoticeVO> selectMaterialInfoBySalesOrderCode(String salesOrderCode) {
ArrayList<SelectAftersalesNoticeVO> selectAftersalesNoticeVOS = new ArrayList<>();
List<SysSalesOrderChild> sysSalesOrderChildList = sysSalesOrderChildMapper.selectOrderChildListBySalesOrderCode(salesOrderCode);
if (CollectionUtils.isEmpty(sysSalesOrderChildList)){
log.warn("与销售订单子表关联的销售单号为空:{}",salesOrderCode);
}
for (SysSalesOrderChild sysSalesOrderChild : sysSalesOrderChildList) {
SelectAftersalesNoticeVO selectAftersalesNoticeVO = new SelectAftersalesNoticeVO();
selectAftersalesNoticeVO.setMaterialNo(sysSalesOrderChild.getMaterialCode());
selectAftersalesNoticeVO.setMaterialName(sysSalesOrderChild.getMaterialName());
selectAftersalesNoticeVO.setMaterialBrand(sysSalesOrderChild.getBrand());
selectAftersalesNoticeVO.setMaterialType(sysSalesOrderChild.getMaterialType());
selectAftersalesNoticeVO.setMaterialUnit(sysSalesOrderChild.getUnit());
selectAftersalesNoticeVO.setMaterialProcessMethod(sysSalesOrderChild.getProcessMethod());
selectAftersalesNoticeVO.setMaterialDescribe(sysSalesOrderChild.getDescribe());
selectAftersalesNoticeVO.setShippedGoodsSum(sysSalesOrderChild.getOutBoundQuantity());
selectAftersalesNoticeVOS.add(selectAftersalesNoticeVO);
}
return selectAftersalesNoticeVOS;
}
/**
* 创建售后单审核流程

124
ruoyi-admin/src/main/java/com/ruoyi/system/controller/BaseEmpRequisiteOrderController.java

@ -1,15 +1,21 @@
package com.ruoyi.system.controller;
import java.util.HashMap;
import java.util.List;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.system.domain.Vo.BaseEmpRequisiteOrderVO;
import com.ruoyi.system.domain.Vo.OutsourceQuoteVO;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.BaseEmpRequisiteOrder;
@ -19,6 +25,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 员工领料单Controller
*
@ -34,6 +43,15 @@ public class BaseEmpRequisiteOrderController extends BaseController
@Autowired
private IBaseEmpRequisiteOrderService baseEmpRequisiteOrderService;
@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private IProcessService processService;
@RequiresPermissions("system:empRequisiteOrder:view")
@GetMapping()
public String empRequisiteOrder()
@ -47,10 +65,10 @@ public class BaseEmpRequisiteOrderController extends BaseController
@RequiresPermissions("system:empRequisiteOrder:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public TableDataInfo list(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
startPage();
List<BaseEmpRequisiteOrder> list = baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrder);
List<BaseEmpRequisiteOrderVO> list = baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrderVO);
return getDataTable(list);
}
@ -61,10 +79,10 @@ public class BaseEmpRequisiteOrderController extends BaseController
@Log(title = "员工领料单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
public AjaxResult export(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public AjaxResult export(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
List<BaseEmpRequisiteOrder> list = baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrder);
ExcelUtil<BaseEmpRequisiteOrder> util = new ExcelUtil<BaseEmpRequisiteOrder>(BaseEmpRequisiteOrder.class);
List<BaseEmpRequisiteOrderVO> list = baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrderVO);
ExcelUtil<BaseEmpRequisiteOrderVO> util = new ExcelUtil<BaseEmpRequisiteOrderVO>(BaseEmpRequisiteOrderVO.class);
return util.exportExcel(list, "员工领料单数据");
}
@ -84,9 +102,87 @@ public class BaseEmpRequisiteOrderController extends BaseController
@Log(title = "员工领料单", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public AjaxResult addSave(@RequestBody BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
return toAjax(baseEmpRequisiteOrderService.insertBaseEmpRequisiteOrder(baseEmpRequisiteOrder));
// 审核状态-待审核
baseEmpRequisiteOrderVO.setAuditStatus("0");
baseEmpRequisiteOrderService.submitApply(baseEmpRequisiteOrderVO);
return AjaxResult.success();
}
/**
* 加载审批弹窗
* @param taskId
* @param mmap
* @return
*/
@GetMapping("/showVerifyDialog/{taskId}")
public String showVerifyDialog(@PathVariable("taskId") String taskId, ModelMap mmap) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO = baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderById(new Long(processInstance.getBusinessKey()));
mmap.put("formData", baseEmpRequisiteOrderVO);
mmap.put("taskId", taskId);
String verifyName = task.getTaskDefinitionKey().substring(0, 1).toUpperCase() + task.getTaskDefinitionKey().substring(1);
return prefix + "/task" + verifyName;
}
/**
* 自动绑定页面字段
*/
@ModelAttribute("preloadObj")
public BaseEmpRequisiteOrderVO getObj(@RequestParam(value = "requisiteId", required = false) Long baseEmpRequisiteOrderId, HttpSession session) {
if (baseEmpRequisiteOrderId != null) {
return baseEmpRequisiteOrderService.selectBaseEmpRequisiteOrderById(baseEmpRequisiteOrderId);
}
return new BaseEmpRequisiteOrderVO();
}
/**
* 完成任务
*
* @return
*/
@RequestMapping(value = "/complete/{taskId}", method = {RequestMethod.POST, RequestMethod.GET})
@ResponseBody
public AjaxResult complete(@PathVariable("taskId") String taskId, @RequestParam(value = "saveEntity", required = false) String saveEntity,
@ModelAttribute("preloadObj") BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO, HttpServletRequest request) {
boolean saveEntityBoolean = BooleanUtils.toBoolean(saveEntity);
//获取实例id
String instanceId = baseEmpRequisiteOrderVO.getInstanceId();
//获取实例类型
String instanceType = baseEmpRequisiteOrderVO.getInstanceType();
boolean approvedFlag = processService.complete(taskId, instanceId, baseEmpRequisiteOrderVO.getApplyTitle(), baseEmpRequisiteOrderVO.getRequisitieCode(), "requisition", new HashMap<String, Object>(), request);
if(!approvedFlag){
// 审核状态-审核拒绝
baseEmpRequisiteOrderVO.setAuditStatus("2");
}
// 如果任务已结束更新业务表状态
boolean processIsFinish = processService.judgeProcessIsFinish(instanceId);
if (processIsFinish) {
// 审核通过
baseEmpRequisiteOrderVO.setAuditStatus("1");
// 提交
if("submit".equals(instanceType)){
// 使用状态-是
// erpBomVo.setUseStatus("1");
}
// 作废
else if("cancel".equals(instanceType)){
// 使用状态-已作废
// erpBomVo.setUseStatus("2");
}
// 恢复
else if("restore".equals(instanceType)){
// 使用状态-是
// erpBomVo.setUseStatus("1");
}
}
baseEmpRequisiteOrderService.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
// 驳回申请后继续申请,可能修改表单
if (saveEntityBoolean) {
baseEmpRequisiteOrderService.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
}
return success("任务已完成");
}
/**
@ -114,9 +210,9 @@ public class BaseEmpRequisiteOrderController extends BaseController
@Log(title = "员工领料单", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public AjaxResult editSave(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
return toAjax(baseEmpRequisiteOrderService.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrder));
return toAjax(baseEmpRequisiteOrderService.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO));
}
/**

23
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysSalesOrderController.java

@ -560,4 +560,27 @@ public class SysSalesOrderController extends BaseController
List<SysSalesOrderChild> list = sysSalesOrderChildService.selectOrderChildListBySalesOrderCode(salesOrderCode);
return getDataTable(list) ;
}
/**
* 发起售后
*/
@GetMapping("/startAftersales/{salesOrderId}")
public String startAftersales(@PathVariable("salesOrderId") Long salesOrderId, ModelMap mmap)
{
SysSalesOrder sysSalesOrder = sysSalesOrderService.selectSysSalesOrderById(salesOrderId);
mmap.put("sysSalesOrder", sysSalesOrder);
return prefix + "/startAftersales";
}
/**
* 发起售后加载销售单号有关的物料信息弹窗
*/
@GetMapping("/startAftersalesMaterialSelect")
public String materialSelect(@RequestParam String salesOrderCode, ModelMap modelMap)
{
modelMap.put("salesOrderCode",salesOrderCode);
return prefix + "/startAftersalesMaterialSelect";
}
}

2
ruoyi-admin/src/main/java/com/ruoyi/system/domain/BaseEmpRequisiteOrderChild.java

@ -87,7 +87,7 @@ public class BaseEmpRequisiteOrderChild extends BaseEntity
@Excel(name = "审核状态")
private String auditStatus;
public void setRequisitioningChildId(Long requisitioningChildId)
public void setRequisitioningChildId(Long requisitioningChildId)
{
this.requisitioningChildId = requisitioningChildId;
}

12
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysSalesOrder.java

@ -1,6 +1,7 @@
package com.ruoyi.system.domain;
import com.google.common.base.Objects;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
@ -161,6 +162,9 @@ public class SysSalesOrder extends BaseEntity {
private List<SysSalesOrderChild> sysSalesOrderChildList;
private List<SelectAftersalesNoticeVO> selectAftersalesNoticeVOList;
public Long getSalesOrderId() {
return salesOrderId;
}
@ -657,6 +661,14 @@ public class SysSalesOrder extends BaseEntity {
this.sysSalesOrderChildList = sysSalesOrderChildList;
}
public List<SelectAftersalesNoticeVO> getSelectAftersalesNoticeVOList() {
return selectAftersalesNoticeVOList;
}
public void setSelectAftersalesNoticeVOList(List<SelectAftersalesNoticeVO> selectAftersalesNoticeVOList) {
this.selectAftersalesNoticeVOList = selectAftersalesNoticeVOList;
}
@Override
public String toString() {
return Objects.toStringHelper(this)

33
ruoyi-admin/src/main/java/com/ruoyi/system/domain/Vo/BaseEmpRequisiteOrderVO.java

@ -0,0 +1,33 @@
package com.ruoyi.system.domain.Vo;
import com.ruoyi.system.domain.BaseEmpRequisiteOrder;
import lombok.Data;
import java.util.Date;
@Data
public class BaseEmpRequisiteOrderVO extends BaseEmpRequisiteOrder {
private static final long serialVersionUID = 1L;
/** 申请人姓名 */
private String applyUserName;
/** 任务ID */
private String taskId;
/** 任务名称 */
private String taskName;
/** 办理时间 */
private Date doneTime;
/** 创建人 */
private String createUserName;
/** 流程实例状态 1 激活 2 挂起 */
private String suspendState;
/** 待办用户id */
private String todoUserId;
/** 流程实例类型名称 */
private String instanceTypeName;
/**
* 关键词
*/
private String keyword;
}

88
ruoyi-admin/src/main/java/com/ruoyi/system/domain/Vo/SelectAftersalesNoticeVO.java

@ -0,0 +1,88 @@
package com.ruoyi.system.domain.Vo;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
@Data
/*销售发起售后选择设备*/
public class SelectAftersalesNoticeVO {
private static final long serialVersionUID = 1L;
/** 售后通知单详情ID */
private Long aftersalesNoticeDetailId;
/** 售后通知单号 */
@Excel(name = "售后通知单号")
private String aftersalesNoticeCode;
/** 关联生产订单号 */
private String makeNo;
/** 关联销售订单编号 */
private String salesOrderCode;
/** 用户ID */
private Long userId;
/** 紧急程度(0一般、1紧急) */
@Excel(name = "紧急程度", readConverterExp = "0=一般、1紧急")
private String emergencyDegree;
/** 售后问题 */
@Excel(name = "售后问题")
private String aftersalesProblem;
/** 报告问题 */
@Excel(name = "报告问题")
private String aftersalesReportUrl;
/** 客户ID */
private String customerId;
/** 客户名称 */
private String customerName;
/** SN号(产品序列号) */
@Excel(name = "SN号", readConverterExp = "产=品序列号")
private String snCode;
/** 设备流水号 */
@Excel(name = "设备流水号")
private String deviceRunningNumber;
/** 物料名称 */
@Excel(name = "物料名称")
private String materialName;
/** 物料类型 */
@Excel(name = "物料类型")
private String materialType;
/** 物料图片地址 */
@Excel(name = "物料图片地址")
private String materialPhotourl;
/** 料号 */
@Excel(name = "料号")
private String materialNo;
/** 物料品牌 */
@Excel(name = "物料品牌")
private String materialBrand;
/** 物料单位 */
@Excel(name = "物料单位")
private String materialUnit;
/** 物料描述 */
@Excel(name = "物料描述")
private String materialDescribe;
/** 物料加工方式 */
@Excel(name = "物料加工方式")
private String materialProcessMethod;
/** 已出库数量 */
@Excel(name = "已出库数量")
private Integer shippedGoodsSum;
}

8
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/BaseEmpRequisiteOrderChildMapper.java

@ -18,7 +18,13 @@ public interface BaseEmpRequisiteOrderChildMapper
* @return 员工单领料单物料信息
*/
public BaseEmpRequisiteOrderChild selectBaseEmpRequisiteOrderChildById(Long requisitioningChildId);
/**
* 查询员工单领料单物料信息
*
* @param requisitioningCode 员工单领料单号
* @return 员工单领料单物料信息
*/
public List<BaseEmpRequisiteOrderChild> selectBaseEmpRequisiteOrderChildByCode(String requisitioningCode);
/**
* 查询员工单领料单物料信息列表
*

15
ruoyi-admin/src/main/java/com/ruoyi/system/mapper/BaseEmpRequisiteOrderMapper.java

@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.BaseEmpRequisiteOrder;
import com.ruoyi.system.domain.Vo.BaseEmpRequisiteOrderVO;
/**
* 员工领料单Mapper接口
@ -17,31 +18,31 @@ public interface BaseEmpRequisiteOrderMapper
* @param requisiteId 员工领料单ID
* @return 员工领料单
*/
public BaseEmpRequisiteOrder selectBaseEmpRequisiteOrderById(Long requisiteId);
public BaseEmpRequisiteOrderVO selectBaseEmpRequisiteOrderById(Long requisiteId);
/**
* 查询员工领料单列表
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 员工领料单集合
*/
public List<BaseEmpRequisiteOrder> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public List<BaseEmpRequisiteOrderVO> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 新增员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 修改员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 删除员工领料单

22
ruoyi-admin/src/main/java/com/ruoyi/system/service/IBaseEmpRequisiteOrderService.java

@ -2,6 +2,9 @@ package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.BaseEmpRequisiteOrder;
import com.ruoyi.system.domain.Vo.BaseEmpRequisiteOrderVO;
import com.ruoyi.system.domain.Vo.OutsourceQuoteVO;
import org.activiti.engine.runtime.ProcessInstance;
/**
* 员工领料单Service接口
@ -17,31 +20,31 @@ public interface IBaseEmpRequisiteOrderService
* @param requisiteId 员工领料单ID
* @return 员工领料单
*/
public BaseEmpRequisiteOrder selectBaseEmpRequisiteOrderById(Long requisiteId);
public BaseEmpRequisiteOrderVO selectBaseEmpRequisiteOrderById(Long requisiteId);
/**
* 查询员工领料单列表
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 员工领料单集合
*/
public List<BaseEmpRequisiteOrder> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public List<BaseEmpRequisiteOrderVO> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 新增员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 修改员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder);
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
/**
* 批量删除员工领料单
@ -74,4 +77,9 @@ public interface IBaseEmpRequisiteOrderService
int restoreBaseEmpRequisiteOrderById(Long requisiteId);
Object getId();
/**
* 审批流程启动
* */
ProcessInstance submitApply(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO);
}

236
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseEmpRequisiteOrderServiceImpl.java

@ -2,15 +2,33 @@ package com.ruoyi.system.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.github.pagehelper.Page;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.system.domain.BaseEmpRequisiteOrderChild;
import com.ruoyi.system.domain.BaseRequisitioningOrderChild;
import com.ruoyi.system.domain.Vo.BaseEmpRequisiteOrderVO;
import com.ruoyi.system.domain.Vo.OutsourceQuoteVO;
import com.ruoyi.system.mapper.BaseEmpRequisiteOrderChildMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysUserService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.persistence.entity.TaskEntityImpl;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.BaseEmpRequisiteOrderMapper;
@ -39,6 +57,24 @@ public class BaseEmpRequisiteOrderServiceImpl implements IBaseEmpRequisiteOrderS
@Autowired
private ISysUserService userService;
@Autowired
private SysRoleServiceImpl roleService;
@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private BizTodoItemMapper todoItemMapper;
@Autowired
private SysUserMapper userMapper;
@Autowired
private IProcessService processService;
/**
* 查询员工领料单
*
@ -46,46 +82,102 @@ public class BaseEmpRequisiteOrderServiceImpl implements IBaseEmpRequisiteOrderS
* @return 员工领料单
*/
@Override
public BaseEmpRequisiteOrder selectBaseEmpRequisiteOrderById(Long requisiteId)
public BaseEmpRequisiteOrderVO selectBaseEmpRequisiteOrderById(Long requisiteId)
{
return baseEmpRequisiteOrderMapper.selectBaseEmpRequisiteOrderById(requisiteId);
BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO = baseEmpRequisiteOrderMapper.selectBaseEmpRequisiteOrderById(requisiteId);
if(baseEmpRequisiteOrderChildMapper.selectBaseEmpRequisiteOrderChildByCode(baseEmpRequisiteOrderVO.getRequisitieCode())!=null){
List<BaseEmpRequisiteOrderChild> child = baseEmpRequisiteOrderChildMapper.selectBaseEmpRequisiteOrderChildByCode(baseEmpRequisiteOrderVO.getRequisitieCode());
baseEmpRequisiteOrderVO.setBaseEmpRequisiteOrderChildList(child);
}
return baseEmpRequisiteOrderVO;
}
/**
* 查询员工领料单列表
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 员工领料单
*/
@Override
public List<BaseEmpRequisiteOrder> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public List<BaseEmpRequisiteOrderVO> selectBaseEmpRequisiteOrderList(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
return baseEmpRequisiteOrderMapper.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrder);
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
// PageHelper 仅对第一个 List 分页
Page<BaseEmpRequisiteOrderVO> list = (Page<BaseEmpRequisiteOrderVO>) baseEmpRequisiteOrderMapper.selectBaseEmpRequisiteOrderList(baseEmpRequisiteOrderVO);
Page<BaseEmpRequisiteOrderVO> returnList = new Page<>();
for (BaseEmpRequisiteOrderVO tempRequisiteVO: list) {
SysUser sysUser = userMapper.selectUserByLoginName(tempRequisiteVO.getCreateBy());
if (sysUser != null) {
tempRequisiteVO.setCreateUserName(sysUser.getUserName());
}
SysUser sysUser2 = userMapper.selectUserByLoginName(tempRequisiteVO.getApplyUser());
if (sysUser2 != null) {
tempRequisiteVO.setApplyUserName(sysUser2.getUserName());
}
String instanceId = tempRequisiteVO.getInstanceId();
// 当前环节
if (StringUtils.isNotBlank(instanceId)) {
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId(instanceId)
// .singleResult();
.list(); // 例如请假会签,会同时拥有多个任务
if (!org.springframework.util.CollectionUtils.isEmpty(taskList)) {
TaskEntityImpl task = (TaskEntityImpl) taskList.get(0);
String taskId = task.getId();
tempRequisiteVO.setTaskId(taskId);
// 设置待办用户
List<String> todoUserList = todoItemMapper.selectUndealTodoUserList(taskId);
if(!org.springframework.util.CollectionUtils.isEmpty(taskList)){
tempRequisiteVO.setTodoUserId(String.join(",",todoUserList));
}
if (task.getSuspensionState() == 2) {
tempRequisiteVO.setTaskName("已挂起");
tempRequisiteVO.setSuspendState("2");
} else {
tempRequisiteVO.setTaskName(task.getName());
tempRequisiteVO.setSuspendState("1");
}
} else {
// 已办结或者已撤销
tempRequisiteVO.setTaskName("已结束");
}
} else {
tempRequisiteVO.setTaskName("未启动");
}
returnList.add(tempRequisiteVO);
}
returnList.setTotal(org.springframework.util.CollectionUtils.isEmpty(list) ? 0 : list.getTotal());
returnList.setPageNum(pageNum);
returnList.setPageSize(pageSize);
return returnList;
}
/**
* 新增员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
@Override
@Transactional(rollbackFor = NullPointerException.class)
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public int insertBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
String loginName = ShiroUtils.getLoginName();
baseEmpRequisiteOrder.setCreateBy(loginName);
baseEmpRequisiteOrder.setCreateTime(DateUtils.getNowDate());
if (baseEmpRequisiteOrder.getRequisitieCode() == null) {
baseEmpRequisiteOrder.setRequisitieCode(redisCache.generateBillNo("QG"));
baseEmpRequisiteOrderVO.setCreateBy(loginName);
baseEmpRequisiteOrderVO.setCreateTime(DateUtils.getNowDate());
if (baseEmpRequisiteOrderVO.getRequisitieCode() == null) {
baseEmpRequisiteOrderVO.setRequisitieCode(redisCache.generateBillNo("QG"));
}
List<BaseEmpRequisiteOrderChild> childList = baseEmpRequisiteOrder.getBaseEmpRequisiteOrderChildList();
List<BaseEmpRequisiteOrderChild> childList = baseEmpRequisiteOrderVO.getBaseEmpRequisiteOrderChildList();
Long materialSum = 0L;
BigDecimal materialRmbSum = new BigDecimal(0);
BigDecimal materialNoRmbSum = new BigDecimal(0);
//物料合计
Integer childSize = childList.size();
if (childSize > 0) {
// Integer childSize = childList.size();
if (childList!=null) {
for (BaseEmpRequisiteOrderChild child : childList) {
//物料数量
materialSum += child.getMaterialNum();
@ -93,45 +185,45 @@ public class BaseEmpRequisiteOrderServiceImpl implements IBaseEmpRequisiteOrderS
materialRmbSum = child.getMaterialRmbSum().setScale(2, RoundingMode.HALF_UP).add(materialNoRmbSum);
//物料含税总价(RMB)
materialNoRmbSum = child.getMaterialNoRmbSum().setScale(2, RoundingMode.HALF_UP).add(materialNoRmbSum);
child.setQuoteId(baseEmpRequisiteOrder.getRequisitieCode());
child.setQuoteId(baseEmpRequisiteOrderVO.getRequisitieCode());
child.setCreateBy(loginName);
child.setCreateTime(DateUtils.getNowDate());
baseEmpRequisiteOrderChildMapper.insertBaseEmpRequisiteOrderChild(child);
}
baseEmpRequisiteOrderVO.setMaterialAmount(Long.valueOf(childList.size()));
}
baseEmpRequisiteOrder.setAuditStatus("1");
baseEmpRequisiteOrder.setUseStatus("1");
baseEmpRequisiteOrder.setMaterialAmount(Long.valueOf(childSize));
baseEmpRequisiteOrder.setMaterialSum(materialSum);
baseEmpRequisiteOrder.setRmbSum(materialRmbSum);
baseEmpRequisiteOrder.setNoRmbSum(materialNoRmbSum);
return baseEmpRequisiteOrderMapper.insertBaseEmpRequisiteOrder(baseEmpRequisiteOrder);
// baseEmpRequisiteOrderVO.setUseStatus("1");
baseEmpRequisiteOrderVO.setMaterialSum(materialSum);
baseEmpRequisiteOrderVO.setRmbSum(materialRmbSum);
baseEmpRequisiteOrderVO.setNoRmbSum(materialNoRmbSum);
System.out.println(baseEmpRequisiteOrderVO);
return baseEmpRequisiteOrderMapper.insertBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
}
/**
* 修改员工领料单
*
* @param baseEmpRequisiteOrder 员工领料单
* @param baseEmpRequisiteOrderVO 员工领料单
* @return 结果
*/
@Override
@Transactional(rollbackFor = NullPointerException.class)
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrder baseEmpRequisiteOrder)
public int updateBaseEmpRequisiteOrder(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO)
{
String loginName = ShiroUtils.getLoginName();
baseEmpRequisiteOrder.setUpdateBy(loginName);
baseEmpRequisiteOrder.setUpdateTime(DateUtils.getNowDate());
baseEmpRequisiteOrderChildMapper.deleteBaseEmpRequisiteOrderChildByCode(baseEmpRequisiteOrder.getRequisitieCode());
if (baseEmpRequisiteOrder.getRequisitieCode() == null) {
baseEmpRequisiteOrder.setRequisitieCode(redisCache.generateBillNo("QG"));
baseEmpRequisiteOrderVO.setUpdateBy(loginName);
baseEmpRequisiteOrderVO.setUpdateTime(DateUtils.getNowDate());
baseEmpRequisiteOrderChildMapper.deleteBaseEmpRequisiteOrderChildByCode(baseEmpRequisiteOrderVO.getRequisitieCode());
if (baseEmpRequisiteOrderVO.getRequisitieCode() == null) {
baseEmpRequisiteOrderVO.setRequisitieCode(redisCache.generateBillNo("QG"));
}
List<BaseEmpRequisiteOrderChild> childList = baseEmpRequisiteOrder.getBaseEmpRequisiteOrderChildList();
List<BaseEmpRequisiteOrderChild> childList = baseEmpRequisiteOrderVO.getBaseEmpRequisiteOrderChildList();
Long materialSum = 0L;
BigDecimal materialRmbSum = new BigDecimal(0);
BigDecimal materialNoRmbSum = new BigDecimal(0);
//物料合计
Integer childSize = childList.size();
if (childSize > 0) {
// Integer childSize = childList.size();
if (childList!=null) {
for (BaseEmpRequisiteOrderChild child : childList) {
//物料数量
materialSum += child.getMaterialNum();
@ -139,19 +231,19 @@ public class BaseEmpRequisiteOrderServiceImpl implements IBaseEmpRequisiteOrderS
materialRmbSum = child.getMaterialRmbSum().setScale(2, RoundingMode.HALF_UP).add(materialNoRmbSum);
//物料含税总价(RMB)
materialNoRmbSum = child.getMaterialNoRmbSum().setScale(2, RoundingMode.HALF_UP).add(materialNoRmbSum);
child.setQuoteId(baseEmpRequisiteOrder.getRequisitieCode());
child.setQuoteId(baseEmpRequisiteOrderVO.getRequisitieCode());
child.setCreateBy(loginName);
child.setCreateTime(DateUtils.getNowDate());
baseEmpRequisiteOrderChildMapper.insertBaseEmpRequisiteOrderChild(child);
}
baseEmpRequisiteOrderVO.setMaterialAmount(Long.valueOf(childList.size()));
}
baseEmpRequisiteOrder.setAuditStatus("1");
baseEmpRequisiteOrder.setUseStatus("1");
baseEmpRequisiteOrder.setMaterialAmount(Long.valueOf(childSize));
baseEmpRequisiteOrder.setMaterialSum(materialSum);
baseEmpRequisiteOrder.setRmbSum(materialRmbSum);
baseEmpRequisiteOrder.setNoRmbSum(materialNoRmbSum);
return baseEmpRequisiteOrderMapper.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrder);
// baseEmpRequisiteOrderVO.setAuditStatus("1");
// baseEmpRequisiteOrderVO.setUseStatus("1");
baseEmpRequisiteOrderVO.setMaterialSum(materialSum);
baseEmpRequisiteOrderVO.setRmbSum(materialRmbSum);
baseEmpRequisiteOrderVO.setNoRmbSum(materialNoRmbSum);
return baseEmpRequisiteOrderMapper.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
}
/**
@ -207,4 +299,68 @@ public class BaseEmpRequisiteOrderServiceImpl implements IBaseEmpRequisiteOrderS
public Object getId() {
return redisCache.generateBillNo("YGLL");
}
/**
* 审批流程启动
* */
@Transactional(rollbackFor = Exception.class)
@Override
public ProcessInstance submitApply(BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO) {
SysUser user = ShiroUtils.getSysUser();
baseEmpRequisiteOrderVO.setApplyUser(user.getLoginName());
baseEmpRequisiteOrderVO.setApplyTime(DateUtils.getNowDate());
// 保存
insertBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
// 启动流程
String applyTitle = user.getUserName()+"发起了委外报价提交审批-"+DateUtils.dateTimeNow();
String instanceType = "submit";
ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,baseEmpRequisiteOrderVO, user);
String processInstanceId = processInstance.getProcessInstanceId();
// 提交实例id
baseEmpRequisiteOrderVO.setSubmitInstanceId(processInstanceId);
// 存在提交完就流程结束的情况
boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId);
if(processIsFinish){
// 审核状态-审核通过
baseEmpRequisiteOrderVO.setAuditStatus("1");
}
baseEmpRequisiteOrderMapper.updateBaseEmpRequisiteOrder(baseEmpRequisiteOrderVO);
return processInstance;
}
/**
* 创建委外报价审核流程
* @param applyTitle
* @param instanceType
* @param user
* @return
*/
private ProcessInstance startProcessInstance(String applyTitle, String instanceType, BaseEmpRequisiteOrderVO baseEmpRequisiteOrderVO, SysUser user) {
Long requisiteId = baseEmpRequisiteOrderVO.getRequisiteId();
String businessKey = requisiteId.toString(); // 实体类 ID,作为流程的业务 key
String key = "requisition";
Map<String,Object> variables = new HashMap<>();
// 构造authority传参
buildAuthority(user, variables);
baseEmpRequisiteOrderVO.setApplyTitle(applyTitle);
// 启动流程
ProcessInstance processInstance = processService.submitApply(user.getLoginName(), businessKey, applyTitle, baseEmpRequisiteOrderVO.getRequisitieCode(), key, variables);
String processInstanceId = processInstance.getId();
baseEmpRequisiteOrderVO.setInstanceId(processInstanceId); // 建立双向关系
baseEmpRequisiteOrderVO.setInstanceType(instanceType);
return processInstance;
}
/**
* 发起人节点判断
* */
private void buildAuthority(SysUser user, Map<String, Object> variables) {
Set<String> roleKeys = roleService.selectRoleKeys(user.getUserId());
// 角色不同审核人不同
if(roleKeys.contains("scyRole")){
variables.put("authority",1);
}
}
}

160
ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml

@ -0,0 +1,160 @@
<?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.sales.mapper.SalesAftersalesNoticeDetailMapper">
<resultMap type="SalesAftersalesNoticeDetail" id="SalesAftersalesNoticeDetailResult">
<result property="aftersalesNoticeDetailId" column="aftersales_notice_detail_id" />
<result property="aftersalesNoticeCode" column="aftersales_notice_code" />
<result property="makeNo" column="make_no" />
<result property="salesOrderCode" column="sales_order_code" />
<result property="userId" column="user_id" />
<result property="emergencyDegree" column="emergency_degree" />
<result property="aftersalesProblem" column="aftersales_problem" />
<result property="aftersalesReportUrl" column="aftersales_report_url" />
<result property="customerId" column="customer_id" />
<result property="customerName" column="customer_name" />
<result property="snCode" column="sn_code" />
<result property="deviceRunningNumber" column="device_running_number" />
<result property="materialName" column="material_name" />
<result property="materialType" column="material_type" />
<result property="materialPhotourl" column="material_photoUrl" />
<result property="materialNo" column="material_no" />
<result property="materialBrand" column="material_brand" />
<result property="materialUnit" column="material_unit" />
<result property="materialDescribe" column="material_describe" />
<result property="materialProcessMethod" column="material_process_method" />
<result property="shippedGoodsSum" column="shipped_goods_sum" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectSalesAftersalesNoticeDetailVo">
select aftersales_notice_detail_id, aftersales_notice_code, make_no, sales_order_code, user_id, emergency_degree, aftersales_problem, aftersales_report_url, customer_id, customer_name, sn_code, device_running_number, material_name, material_type, material_photoUrl, material_no, material_brand, material_unit, material_describe, material_process_method, shipped_goods_sum, create_by, create_time, update_by, update_time, remark from sales_aftersales_notice_detail
</sql>
<select id="selectSalesAftersalesNoticeDetailList" parameterType="SalesAftersalesNoticeDetail" resultMap="SalesAftersalesNoticeDetailResult">
<include refid="selectSalesAftersalesNoticeDetailVo"/>
<where>
</where>
</select>
<select id="selectSalesAftersalesNoticeDetailById" parameterType="Long" resultMap="SalesAftersalesNoticeDetailResult">
<include refid="selectSalesAftersalesNoticeDetailVo"/>
where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</select>
<insert id="insertSalesAftersalesNoticeDetail" parameterType="SalesAftersalesNoticeDetail" useGeneratedKeys="true" keyProperty="aftersalesNoticeDetailId">
insert into sales_aftersales_notice_detail
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="aftersalesNoticeCode != null">aftersales_notice_code,</if>
<if test="makeNo != null">make_no,</if>
<if test="salesOrderCode != null">sales_order_code,</if>
<if test="userId != null">user_id,</if>
<if test="emergencyDegree != null">emergency_degree,</if>
<if test="aftersalesProblem != null">aftersales_problem,</if>
<if test="aftersalesReportUrl != null">aftersales_report_url,</if>
<if test="customerId != null">customer_id,</if>
<if test="customerName != null">customer_name,</if>
<if test="snCode != null">sn_code,</if>
<if test="deviceRunningNumber != null">device_running_number,</if>
<if test="materialName != null">material_name,</if>
<if test="materialType != null">material_type,</if>
<if test="materialPhotourl != null">material_photoUrl,</if>
<if test="materialNo != null">material_no,</if>
<if test="materialBrand != null">material_brand,</if>
<if test="materialUnit != null">material_unit,</if>
<if test="materialDescribe != null">material_describe,</if>
<if test="materialProcessMethod != null">material_process_method,</if>
<if test="shippedGoodsSum != null">shipped_goods_sum,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="aftersalesNoticeCode != null">#{aftersalesNoticeCode},</if>
<if test="makeNo != null">#{makeNo},</if>
<if test="salesOrderCode != null">#{salesOrderCode},</if>
<if test="userId != null">#{userId},</if>
<if test="emergencyDegree != null">#{emergencyDegree},</if>
<if test="aftersalesProblem != null">#{aftersalesProblem},</if>
<if test="aftersalesReportUrl != null">#{aftersalesReportUrl},</if>
<if test="customerId != null">#{customerId},</if>
<if test="customerName != null">#{customerName},</if>
<if test="snCode != null">#{snCode},</if>
<if test="deviceRunningNumber != null">#{deviceRunningNumber},</if>
<if test="materialName != null">#{materialName},</if>
<if test="materialType != null">#{materialType},</if>
<if test="materialPhotourl != null">#{materialPhotourl},</if>
<if test="materialNo != null">#{materialNo},</if>
<if test="materialBrand != null">#{materialBrand},</if>
<if test="materialUnit != null">#{materialUnit},</if>
<if test="materialDescribe != null">#{materialDescribe},</if>
<if test="materialProcessMethod != null">#{materialProcessMethod},</if>
<if test="shippedGoodsSum != null">#{shippedGoodsSum},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateSalesAftersalesNoticeDetail" parameterType="SalesAftersalesNoticeDetail">
update sales_aftersales_notice_detail
<trim prefix="SET" suffixOverrides=",">
<if test="aftersalesNoticeCode != null">aftersales_notice_code = #{aftersalesNoticeCode},</if>
<if test="makeNo != null">make_no = #{makeNo},</if>
<if test="salesOrderCode != null">sales_order_code = #{salesOrderCode},</if>
<if test="userId != null">user_id = #{userId},</if>
<if test="emergencyDegree != null">emergency_degree = #{emergencyDegree},</if>
<if test="aftersalesProblem != null">aftersales_problem = #{aftersalesProblem},</if>
<if test="aftersalesReportUrl != null">aftersales_report_url = #{aftersalesReportUrl},</if>
<if test="customerId != null">customer_id = #{customerId},</if>
<if test="customerName != null">customer_name = #{customerName},</if>
<if test="snCode != null">sn_code = #{snCode},</if>
<if test="deviceRunningNumber != null">device_running_number = #{deviceRunningNumber},</if>
<if test="materialName != null">material_name = #{materialName},</if>
<if test="materialType != null">material_type = #{materialType},</if>
<if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if>
<if test="materialNo != null">material_no = #{materialNo},</if>
<if test="materialBrand != null">material_brand = #{materialBrand},</if>
<if test="materialUnit != null">material_unit = #{materialUnit},</if>
<if test="materialDescribe != null">material_describe = #{materialDescribe},</if>
<if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if>
<if test="shippedGoodsSum != null">shipped_goods_sum = #{shippedGoodsSum},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</update>
<delete id="deleteSalesAftersalesNoticeDetailById" parameterType="Long">
delete from sales_aftersales_notice_detail where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</delete>
<delete id="deleteSalesAftersalesNoticeDetailByIds" parameterType="String">
delete from sales_aftersales_notice_detail where aftersales_notice_detail_id in
<foreach item="aftersalesNoticeDetailId" collection="array" open="(" separator="," close=")">
#{aftersalesNoticeDetailId}
</foreach>
</delete>
<update id="cancelSalesAftersalesNoticeDetailById" parameterType="Long">
update sales_aftersales_notice_detail set del_flag = '1' where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</update>
<update id="restoreSalesAftersalesNoticeDetailById" parameterType="Long">
update sales_aftersales_notice_detail set del_flag = '0' where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</update>
</mapper>

13
ruoyi-admin/src/main/resources/mapper/system/BaseEmpRequisiteOrderChildMapper.xml

@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectBaseEmpRequisiteOrderChildVo">
select requisitioning_child_id, quote_id, material_id, material_code, photoUrl, material_name, material_type, material_model, specifications, brand, describe, materialNum, materialRmb, materialNoRmb, materialNoRmbSum, materialRmbSum, remark, create_by, create_time, update_by, update_time, use_status, audit_status from base_emp_requisite_order_child
select requisitioning_child_id, quote_id, material_id, material_code, photoUrl, material_name, material_type, material_model, specifications, brand, `describe`, materialNum, materialRmb, materialNoRmb, materialNoRmbSum, materialRmbSum, remark, create_by, create_time, update_by, update_time, use_status, audit_status from base_emp_requisite_order_child
</sql>
<select id="selectBaseEmpRequisiteOrderChildList" parameterType="BaseEmpRequisiteOrderChild" resultMap="BaseEmpRequisiteOrderChildResult">
@ -61,7 +61,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBaseEmpRequisiteOrderChildVo"/>
where requisitioning_child_id = #{requisitioningChildId}
</select>
<select id="selectBaseEmpRequisiteOrderChildByCode" parameterType="String" resultMap="BaseEmpRequisiteOrderChildResult">
<include refid="selectBaseEmpRequisiteOrderChildVo"/>
where quote_id = #{quoteId}
</select>
<insert id="insertBaseEmpRequisiteOrderChild" parameterType="BaseEmpRequisiteOrderChild" useGeneratedKeys="true" keyProperty="requisitioningChildId">
insert into base_emp_requisite_order_child
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -74,7 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialModel != null">material_model,</if>
<if test="specifications != null">specifications,</if>
<if test="brand != null">brand,</if>
<if test="describe != null">describe,</if>
<if test="describe != null">`describe`,</if>
<if test="materialNum != null">materialNum,</if>
<if test="materialRmb != null">materialRmb,</if>
<if test="materialNoRmb != null">materialNoRmb,</if>
@ -146,7 +151,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<delete id="deleteBaseEmpRequisiteOrderChildById" parameterType="Long">
delete from base_emp_requisite_order_child where requisitioning_child_id = #{requisitioningChildId}
</delete>
<delete id="deleteBaseEmpRequisiteOrderChildByCode" parameterType="Long">
<delete id="deleteBaseEmpRequisiteOrderChildByCode" parameterType="String">
delete from base_emp_requisite_order_child where quote_id = #{code}
</delete>
<delete id="deleteBaseEmpRequisiteOrderChildByIds" parameterType="String">

44
ruoyi-admin/src/main/resources/mapper/system/BaseEmpRequisiteOrderMapper.xml

@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.BaseEmpRequisiteOrderMapper">
<resultMap type="BaseEmpRequisiteOrder" id="BaseEmpRequisiteOrderResult">
<resultMap type="BaseEmpRequisiteOrderVO" id="BaseEmpRequisiteOrderResult">
<result property="requisiteId" column="requisite_id" />
<result property="auditStatus" column="audit_status" />
<result property="requisitieStatus" column="requisitie_status" />
@ -21,13 +21,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="useStatus" column="use_status" />
<result property="instanceId" column="instance_id" />
<result property="instanceType" column="instance_type" />
<result property="submitInstanceId" column="submit_instance_id" />
<result property="applyTitle" column="apply_title" />
<result property="applyTime" column="apply_time" />
<result property="cancelInstanceId" column="cancel_instance_id" />
<result property="restoreInstanceId" column="restore_instance_id" />
</resultMap>
<sql id="selectBaseEmpRequisiteOrderVo">
select requisite_id, audit_status, requisitie_status, requisitie_code, correlation_code, material_amount, material_sum, noRmbSum, rmbSum, apply_user, create_by, create_time, update_by, update_time, remark, use_status from base_emp_requisite_order
select requisite_id, audit_status, requisitie_status, requisitie_code, correlation_code, material_amount, material_sum, noRmbSum, rmbSum, create_by, create_time, update_by, update_time, remark, use_status,instance_id, instance_type, submit_instance_id, apply_title, apply_time, apply_user, cancel_instance_id, restore_instance_id from base_emp_requisite_order
</sql>
<select id="selectBaseEmpRequisiteOrderList" parameterType="BaseEmpRequisiteOrder" resultMap="BaseEmpRequisiteOrderResult">
<select id="selectBaseEmpRequisiteOrderList" parameterType="BaseEmpRequisiteOrderVO" resultMap="BaseEmpRequisiteOrderResult">
<include refid="selectBaseEmpRequisiteOrderVo"/>
<where>
<if test="auditStatus != null and auditStatus != ''"> and audit_status = #{auditStatus}</if>
@ -44,7 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where requisite_id = #{requisiteId}
</select>
<insert id="insertBaseEmpRequisiteOrder" parameterType="BaseEmpRequisiteOrder" useGeneratedKeys="true" keyProperty="requisiteId">
<insert id="insertBaseEmpRequisiteOrder" parameterType="BaseEmpRequisiteOrderVO" useGeneratedKeys="true" keyProperty="requisiteId">
insert into base_emp_requisite_order
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="auditStatus != null">audit_status,</if>
@ -55,13 +62,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialSum != null">material_sum,</if>
<if test="noRmbSum != null">noRmbSum,</if>
<if test="rmbSum != null">rmbSum,</if>
<if test="applyUser != null">apply_user,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="useStatus != null">use_status,</if>
<if test="instanceId != null">instance_id,</if>
<if test="instanceType != null">instance_type,</if>
<if test="submitInstanceId != null">submit_instance_id,</if>
<if test="applyTitle != null">apply_title,</if>
<if test="applyTime != null">apply_time,</if>
<if test="applyUser != null">apply_user,</if>
<if test="cancelInstanceId != null">cancel_instance_id,</if>
<if test="restoreInstanceId != null">restore_instance_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="auditStatus != null">#{auditStatus},</if>
@ -72,17 +86,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialSum != null">#{materialSum},</if>
<if test="noRmbSum != null">#{noRmbSum},</if>
<if test="rmbSum != null">#{rmbSum},</if>
<if test="applyUser != null">#{applyUser},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="useStatus != null">#{useStatus},</if>
<if test="instanceId != null">#{instanceId},</if>
<if test="instanceType != null">#{instanceType},</if>
<if test="submitInstanceId != null">#{submitInstanceId},</if>
<if test="applyTitle != null">#{applyTitle},</if>
<if test="applyTime != null">#{applyTime},</if>
<if test="applyUser != null">#{applyUser},</if>
<if test="cancelInstanceId != null">#{cancelInstanceId},</if>
<if test="restoreInstanceId != null">#{restoreInstanceId},</if>
</trim>
</insert>
<update id="updateBaseEmpRequisiteOrder" parameterType="BaseEmpRequisiteOrder">
<update id="updateBaseEmpRequisiteOrder" parameterType="BaseEmpRequisiteOrderVO">
update base_emp_requisite_order
<trim prefix="SET" suffixOverrides=",">
<if test="auditStatus != null">audit_status = #{auditStatus},</if>
@ -93,13 +114,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialSum != null">material_sum = #{materialSum},</if>
<if test="noRmbSum != null">noRmbSum = #{noRmbSum},</if>
<if test="rmbSum != null">rmbSum = #{rmbSum},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="useStatus != null">use_status = #{useStatus},</if>
<if test="instanceId != null">instance_id = #{instanceId},</if>
<if test="instanceType != null">instance_type = #{instanceType},</if>
<if test="submitInstanceId != null">submit_instance_id = #{submitInstanceId},</if>
<if test="applyTitle != null">apply_title = #{applyTitle},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="cancelInstanceId != null">cancel_instance_id = #{cancelInstanceId},</if>
<if test="restoreInstanceId != null">restore_instance_id = #{restoreInstanceId},</if>
</trim>
where requisite_id = #{requisiteId}
</update>

1
ruoyi-admin/src/main/resources/mapper/system/OutsourceQuoteMapper.xml

@ -20,7 +20,6 @@
<result property="remark" column="remark" />
<result property="instanceId" column="instance_id" />
<result property="instanceType" column="instance_type" />
<result property="instanceTypeName" column="instance_type_name" />
<result property="submitInstanceId" column="submit_instance_id" />
<result property="applyTitle" column="apply_title" />
<result property="applyTime" column="apply_time" />

2
ruoyi-admin/src/main/resources/mapper/system/SysSalesOrderChildMapper.xml

@ -91,7 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectOrderChildListBySalesOrderCode" resultMap="SysSalesOrderChildResult">
select id, quoteId, materialId, materialCode, materialName, materialType, processMethod, brand,
warehouseDept,materialNum, photoUrl,finish_num,apply_shipping_num,has_apply_shipping_num
warehouseDept,materialNum, photoUrl,finish_num,apply_shipping_num,has_apply_shipping_num,out_bound_quantity
from sys_sales_order_child
where quoteId = #{quoteId}
</select>

63
ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/add.html

@ -130,7 +130,7 @@
$("#bootstrap-sub-table-empRequisitionChild").bootstrapTable('insertRow', {
index:1,
row: {
materialId:rowData.id,
materialId:rowData.materialId,
materialCode: rowData.materialNo,
materialName: rowData.materialName,
materialType: rowData.materialType,
@ -139,11 +139,11 @@
unit: rowData.unit,
processMethod: rowData.processMethod,
photoUrl: rowData.photoUrl,
materialNum: "",
materialRmb: "",
materialNoRmb: "",
materialNoRmbSum: "",
materialRmbSum: "",
materialNum: 0,
materialRmb: 0,
materialNoRmb: 0,
materialNoRmbSum: 0,
materialRmbSum: 0,
remark: ""
}
})
@ -165,12 +165,59 @@
values: id
})
}
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-empRequisiteOrder-add').serialize());
var baseEmpRequisiteOrderVO = {};
if ($.validate.form()) {
var baseEmpRequisiteOrderChildList = [];
// 获取表单数据
const Data = $("#form-empRequisiteOrder-add").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
baseEmpRequisiteOrderVO = {
requisitieCode: Data.requisitieCode,
correlationCode: Data.correlationCode,
remark: Data.remark,
materialAmount: 0,
baseEmpRequisiteOrderChildList: []
}
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
var rows = $('#bootstrap-sub-table-empRequisitionChild').bootstrapTable('getData');
// 检查表格数据是否为空
if (rows.length === 0) {
$.modal.alertWarning("请至少添加一条物料信息再保存!");
return;
} else {
baseEmpRequisiteOrderVO.materialAmount = rows.length;
for (var i = 0; i < rows.length; i++) {
var requisiteChild = {
materialId: rows[i].id,
materialCode: rows[i].materialNo,
materialName: rows[i].materialName,
materialType: rows[i].materialType,
describe: rows[i].describe,
brand: rows[i].brand,
unit: rows[i].unit,
processMethod: rows[i].processMethod,
photoUrl: rows[i].photoUrl,
materialNum: rows[i].materialNum,
materialRmb: rows[i].materialRmb,
materialNoRmb: rows[i].materialNoRmb,
materialNoRmbSum: rows[i].materialNoRmbSum,
materialRmbSum: rows[i].materialRmbSum,
remark: rows[i].remark
};
baseEmpRequisiteOrderVO.baseEmpRequisiteOrderChildList.push(requisiteChild);
}
}
console.log(JSON.stringify(baseEmpRequisiteOrderVO));
$.operate.saveJson(prefix + "/add", JSON.stringify(baseEmpRequisiteOrderVO));
// $.operate.save(prefix + "/add", $('#form-empRequisiteOrder-add').serialize());
}
}
}
function getSelections(){
$.ajax({
url: ctx + "system/requisitioning/getEmpUserName",

1
ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/detail.html

@ -59,6 +59,7 @@
pagination: false,
sidePagination: "client",
model: "物料报价信息",
data: [[${baseEmpRequisiteOrder.baseEmpRequisiteOrderChildList}]],
columns: [
{checkbox: true},
{field: 'index',align: 'center', title: "序号",

18
ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/empRequisiteOrder.html

@ -51,6 +51,7 @@
</div>
</div>
<th:block th:include="include :: footer" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('system:empRequisiteOrder:edit')}]];
var removeFlag = [[${@permission.hasPermi('system:empRequisiteOrder:remove')}]];
@ -59,6 +60,7 @@
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var requisitieStatusDatas = [[${@dict.getType('pickStatus')}]];
var useStatusDatas = [[${@dict.getType('useStatus')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "system/empRequisiteOrder";
$(function() {
@ -107,6 +109,22 @@
align: 'center',
formatter: function(value, row, index) {
var actions = [];
// 有流程实例id
if (row.instanceId) {
// 有待办人展示审批按钮,
if (row.todoUserId) {
var todoUserIdList = row.todoUserId.split(",");
if(todoUserIdList.includes(loginName) || loginName == 'admin'){
var nodeName = row.taskName=='驳回调整'?' 调整申请':' 审批';
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="showVerifyDialog(\'' + prefix + '\',\'' + row.taskId + '\', \'' + row.taskName+"-"+"申请" + '\')"><i class="fa fa-edit"></i> '+nodeName+'</a> ');
}
}
// 审批历史
actions.push('<a class="btn btn-warning btn-xs" href="javascript:void(0)" onclick="showHistoryDialog(\'' + row.instanceId + '\')"><i class="fa fa-list"></i> 审批历史</a> ');
// 进度查看
actions.push('<a class="btn btn-info btn-xs" href="javascript:void(0)" onclick="showProcessImgDialog(\'' + row.instanceId + '\')"><i class="fa fa-image"></i> 进度查看</a> ');
}
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.requisiteId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-primary btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.requisiteId + '\')"><i class="fa fa-deatil"></i>详情</a> ');
if(row.delFlag == '0'){

153
ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/taskScjlVerify.html

@ -0,0 +1,153 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('业务经理审核员工领料单')" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: summernote-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-empRequisition-scjl" th:object="${formData}">
<input name="requisiteId" th:field="*{requisiteId}" type="hidden">
<input name="taskId" th:field="*{taskId}" type="hidden">
<input name="taskName" th:field="*{taskName}" type="hidden">
<input name="instanceId" th:field="*{instanceId}" type="hidden">
<input name="instanceType" th:field="*{instanceType}" type="hidden">
<input type="hidden" name="p_COM_comment" />
<div class="form-group">
<label class="col-sm-3 control-label">领料单编号:</label>
<div class="col-sm-8">
<input name="requisitieCode" th:field="*{requisitieCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">关联销售订单号:</label>
<div class="col-sm-8">
<input name="correlationCode" th:field="*{correlationCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用途:</label>
<div class="col-sm-8">
<input name="remark" th:field="*{remark}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required" for="scjlVerifyApproved">审批意见:</label>
<div class="col-sm-6">
<select name="p_B_scjlVerifyApproved" id="scjlVerifyApproved" class="form-control" required>
<option value=""></option>
<option value="true">同意</option>
<option value="false">拒绝</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label">批注:</label>
<div class="col-sm-6">
<textarea name="comment" class="form-control"></textarea>
</div>
</div>
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>报价信息</span>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-empRequisitionChild"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: summernote-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "system/empRequisiteOrder";
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
$("#form-empRequisition-scjl").validate({
focusCleanup: true
});
//获取子表信息
$(function() {
var options = {
id:'bootstrap-sub-table-empRequisitionChild',
pagination: false,
sidePagination: "client",
model: "物料报价信息",
data: [[${formData.baseEmpRequisiteOrderChildList}]],
columns: [
{checkbox: true},
{field: 'index',align: 'center', title: "序号",
formatter: function (value, row, index) {
var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
return columnIndex + $.table.serialNumber(index);
}
},
{title: '物料索引id',field: 'materialId',align: 'center',visible: false},
{title: '料号',field: 'materialCode',align: 'center'},
{title: '物料名称',field: 'materialName',align: 'center'},
{title: '图片',field: 'photoUrl',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{title: '物料类型',field: 'materialType',align: 'center',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{title: '型号',field: 'materialModel',align: 'center'},
{title: '规格',field: 'specification',align: 'center'},
{ title: '描述',field: 'describe',align: 'center'},
{title: '品牌',field: 'brand',align: 'center'},
{ title: '单位',field: 'unit',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{title: '半成品类型',field: 'processMethod',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{title: '物料的数量', field: 'materialNum',align: 'center',editable: true,},
{title: '物料的不含税单价(RMB)',field: 'materialNoRmb',align: 'center',},
{title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center',},
{title: '物料的含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',},
{title: '物料的不含税总价(RMB)',field: 'materialRmbSum',align: 'center',},
{title: '录入人',field: 'createBy',align: 'center',visible: false},
{title: '录入时间',field: 'createTime',align: 'center',visible: false },
{title: '更新人',field: 'updateBy',align: 'center',visible: false},
{title: '上次更新时间',field: 'updateTime',align: 'center',visible: false},
{title: '备注',field: 'remark',align: 'center',editable: true},
],
onEditableSave:function(field, row, oldValue, $el){
row.materialNoRmbSum = Number(row.materialNum * Number(row.materialNoRmb)).toFixed(2);
row.materialRmbSum = Number(row.materialRmb * row.materialNum).toFixed(2);
},
};
$.table.init(options);
});
function submitHandler() {
if ($.validate.form()) {
if ($('textarea[name="comment"]').val()) {
$('input[name="p_COM_comment"]').val($('textarea[name="comment"]').val());
}
var taskId = [[${taskId}]];
$.operate.save(prefix + "/complete/" + taskId, $('#form-empRequisition-scjl').serialize());
}
}
</script>
</body>
</html>

151
ruoyi-admin/src/main/resources/templates/system/empRequisiteOrder/taskSczgVerify.html

@ -0,0 +1,151 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('业务主管审核员工领料单')" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: summernote-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-empRequisition-sczg" th:object="${formData}">
<input name="requisiteId" th:field="*{requisiteId}" type="hidden">
<input name="taskId" th:field="*{taskId}" type="hidden">
<input name="taskName" th:field="*{taskName}" type="hidden">
<input name="instanceId" th:field="*{instanceId}" type="hidden">
<input name="instanceType" th:field="*{instanceType}" type="hidden">
<input type="hidden" name="p_COM_comment" />
<div class="form-group">
<label class="col-sm-3 control-label">领料单编号:</label>
<div class="col-sm-8">
<input name="requisitieCode" th:field="*{requisitieCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">关联销售订单号:</label>
<div class="col-sm-8">
<input name="correlationCode" th:field="*{correlationCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用途:</label>
<div class="col-sm-8">
<input name="remark" th:field="*{remark}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required" for="sczgVerifyApproved">审批意见:</label>
<div class="col-sm-6">
<select name="p_B_sczgVerifyApproved" id="sczgVerifyApproved" class="form-control" required>
<option value=""></option>
<option value="true">同意</option>
<option value="false">拒绝</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-6 control-label">批注:</label>
<div class="col-sm-6">
<textarea name="comment" class="form-control"></textarea>
</div>
</div>
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>报价信息</span>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-empRequisitionChild"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: summernote-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "system/empRequisiteOrder";
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
$("#form-empRequisition-sczg").validate({
focusCleanup: true
});
//获取子表信息
$(function() {
var options = {
id:'bootstrap-sub-table-empRequisitionChild',
pagination: false,
sidePagination: "client",
model: "物料报价信息",
data: [[${formData.baseEmpRequisiteOrderChildList}]],
columns: [
{checkbox: true},
{field: 'index',align: 'center', title: "序号",
formatter: function (value, row, index) {
var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
return columnIndex + $.table.serialNumber(index);
}
},
{title: '物料索引id',field: 'materialId',align: 'center',visible: false},
{title: '料号',field: 'materialCode',align: 'center'},
{title: '物料名称',field: 'materialName',align: 'center'},
{title: '图片',field: 'photoUrl',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{title: '物料类型',field: 'materialType',align: 'center',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{title: '型号',field: 'materialModel',align: 'center'},
{title: '规格',field: 'specification',align: 'center'},
{ title: '描述',field: 'describe',align: 'center'},
{title: '品牌',field: 'brand',align: 'center'},
{ title: '单位',field: 'unit',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{title: '半成品类型',field: 'processMethod',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{title: '物料的数量', field: 'materialNum',align: 'center',editable: true,},
{title: '物料的不含税单价(RMB)',field: 'materialNoRmb',align: 'center',},
{title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center',},
{title: '物料的含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',},
{title: '物料的不含税总价(RMB)',field: 'materialRmbSum',align: 'center',},
{title: '录入人',field: 'createBy',align: 'center',visible: false},
{title: '录入时间',field: 'createTime',align: 'center',visible: false },
{title: '更新人',field: 'updateBy',align: 'center',visible: false},
{title: '上次更新时间',field: 'updateTime',align: 'center',visible: false},
{title: '备注',field: 'remark',align: 'center',editable: true},
],
};
console.log(options.data);
$.table.init(options);
});
function submitHandler() {
if ($.validate.form()) {
if ($('textarea[name="comment"]').val()) {
$('input[name="p_COM_comment"]').val($('textarea[name="comment"]').val());
}
var taskId = [[${taskId}]];
$.operate.save(prefix + "/complete/" + taskId, $('#form-empRequisition-sczg').serialize());
}
}
</script>
</body>
</html>

18
ruoyi-admin/src/main/resources/templates/system/salesOrder/salesOrder.html

@ -196,6 +196,10 @@
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('system:salesOrder:edit')}]];
var removeFlag = [[${@permission.hasPermi('system:salesOrder:remove')}]];
var salesDeliverGoodsFlag = [[${@permission.hasPermi('system:salesOrder:salesDeliverGoods')}]];
var startAftersalesFlag = [[${@permission.hasPermi('sales:afterSalesNotice:startAftersales')}]];
var salesOrderTypeDatas = [[${@dict.getType('sys_order_type')}]];
var useStatusDatas = [[${@dict.getType('useStatus')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
@ -358,11 +362,13 @@
// 生产状态部分完成/全部完成
if (row.makeStatus == "5" || row.makeStatus == "6"){
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="salesDeliverGoods(\'' + row.salesOrderId + '\')"><i class="fa fa-edit"></i> 出货</a> ');
actions.push('<a class="btn btn-success btn-xs ' + salesDeliverGoodsFlag + '" href="javascript:void(0)" onclick="salesDeliverGoods(\'' + row.salesOrderId + '\')"><i class="fa fa-edit"></i>出货</a> ');
}
if (row.closeStatus == 3){
actions.push('<a class="btn btn-success btn-xs ' + startAftersalesFlag + '" href="javascript:void(0)" onclick="startAftersales(\'' + row.salesOrderId + '\')"><i class="fa fa-edit"></i>售后</a> ');
}
// 详情
actions.push('<a class="btn btn-primary btn-xs" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.salesOrderId + '\')"><i class="fa fa-eye"></i> 详情</a> ');
actions.push('<a class="btn btn-primary btn-xs " href="javascript:void(0)" onclick="$.operate.detail(\'' + row.salesOrderId + '\')"><i class="fa fa-eye"></i> 详情</a> ');
return actions.join('');
}
}
@ -381,6 +387,12 @@
var url = prefix + "/salesDeliverGoods/" + salesOrderId;
$.modal.open("出货",url);
}
//售后
function startAftersales(salesOrderId){
var url = prefix + "/startAftersales/" + salesOrderId;
$.modal.open("售后",url);
}
</script>
</body>
</html>

283
ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersales.html

@ -0,0 +1,283 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('销售订单发起售后')" />
<th:block th:include="include :: datetimepicker-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-startAftersales-edit" th:object="${sysSalesOrder}">
<input name="salesOrderId" th:field="*{salesOrderId}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">订单类型:</label>
<div class="col-sm-8">
<select name="salesOrderType" class="form-control m-b" th:with="type=${@dict.getType('sys_order_type')}" disabled>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{salesOrderType}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">销售单号:</label>
<div class="col-sm-8">
<input name="salesOrderCode" th:field="*{salesOrderCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户ID:</label>
<div class="col-sm-8">
<input name="enterpriseCode" th:field="*{enterpriseCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户名称:</label>
<div class="col-sm-8">
<input name="enterpriseName" th:field="*{enterpriseName}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货联系人:</label>
<div class="col-sm-8">
<input name="customerDelivery" th:field="*{customerDelivery}" class="form-control" type="text" disabled>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货电话:</label>
<div class="col-sm-8">
<input name="deliveryPhone" th:field="*{deliveryPhone}" class="form-control" type="text" disabled>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货地址:</label>
<div class="col-sm-8">
<input name="deliveryAddress" th:field="*{deliveryAddress}" class="form-control" type="text" disabled>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注:</label>
<div class="col-sm-8">
<input name="remark" th:field="*{remark}" class="form-control" type="text">
</div>
</div>
</form>
<!--物料信息-->
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>选择物料</span>
<a class="btn btn-success" onclick="insertRow()">
<i class="fa fa-plus"></i> 选择物料
</a>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<!--用于可以修改列表字段的插件-->
<th:block th:include="include :: bootstrap-table-editable-js" />
<script th:inline="javascript">
var sysSalesOrder = [[${sysSalesOrder}]];
var prefix = ctx + "sales/afterSalesNotice";
$("#form-startAftersales-edit").validate({
focusCleanup: true
});
// 新增提交
function submitHandler() {
// 获取表单数据
const salesOrderData = $("#form-startAftersales-edit").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
var table = $('#bootstrap-table').bootstrapTable('getData');
// 将表数据转换成与complaintNoticeData格式一致的数组
var materialDataList = table.map(function(item) {
// 根据实际字段名调整
return {
materialNo:item.materialNo,
materialPhotourl:item.materialPhotourl,
materialName: item.materialName,
materialType: item.materialType,
materialDescribe: item.materialDescribe,
materialBrand: item.materialBrand,
materialUnit: item.materialUnit,
materialProcessMethod: item.materialProcessMethod,
shippedGoodsSum: item.shippedGoodsSum,
snCode:item.snCode,
aftersalesProblem:item.aftersalesProblem,
emergencyDegree:item.emergencyDegree,
aftersalesReportUrl:item.aftersalesReportUrl,
// ...其他字段
};
});
const combinedData = Object.assign({}, salesOrderData, {
selectAftersalesNoticeVOList: materialDataList,
});
// 合并表单数据和表格数据
console.log(combinedData)
// 使用 JSON.stringify() 序列化数据
const jsonData = JSON.stringify(combinedData);
// 发送 AJAX 请求到后端接口
$.operate.saveJson(prefix + "/startAftersales", jsonData);
}
/*选择物料按钮*/
function insertRow() {
var selectedSalesOrderCode = $("#salesOrderCode").val();
var encodedSalesOrderCode = encodeURIComponent(selectedSalesOrderCode);
var url = ctx + 'system/salesOrder/startAftersalesMaterialSelect?salesOrderCode=' + encodedSalesOrderCode;
var options = {
title: '选择物料',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-startAftersalesMaterialSelect-table').bootstrapTable('getSelections')[0];
//判断是否重复
var rows = $("#bootstrap-table").bootstrapTable('getData').length;
for(var i=0;i<rows;i++){
var data = $("#bootstrap-table").bootstrapTable('getData')[i];
if(data.materialNo==rowData.materialNo){
$.modal.alertError("不能选择已添加过的相同料号");
return;
}
}
console.log("rowData: "+rowData);
$("#bootstrap-table").bootstrapTable('insertRow', {
index:1,
row: {
materialNo:rowData.materialNo,
materialPhotourl:rowData.materialPhotourl,
materialName: rowData.materialName,
materialType: rowData.materialType,
materialDescribe: rowData.materialDescribe,
materialBrand: rowData.materialBrand,
materialUnit: rowData.materialUnit,
materialProcessMethod: rowData.materialProcessMethod,
shippedGoodsSum: rowData.shippedGoodsSum,
snCode:"",
aftersalesProblem:"",
emergencyDegree:"",
aftersalesReportUrl:"",
}
})
layer.close(index);
}
//物料信息展示列表
$(function() {
var options = {
modalName: "选择物料",
queryParams: queryParams,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
pagination: false, // 设置不分页
columns: [{
checkbox: true
},
{
title: '料号',
field: 'materialNo',
},
{
title: '图片',
field: 'materialPhotourl',
},
{
title: '物料名称',
field: 'materialName',
},
{
title: '物料类型',
field: 'materialType',
},
{
title: '单位',
field: 'materialUnit',
},
{
title: '品牌',
field: 'materialBrand',
},
{
title: '描述',
field: 'materialDescribe',
},
{
title: '已出库数量',
field: 'shippedGoodsSum',
},
{
title: '设备SN',
field: 'snCode',
editable: {
type: 'text', // 表示该列可以被编辑为文本
},
},
{
title: '售后问题',
field: 'aftersalesProblem',
editable: {
type: 'text',
},
},
{
title: '紧急程度',
field: 'emergencyDegree',
editable: {
type: 'select',
title: '紧急程度',
source:[{value:"0",text:"一般"},{value:"1",text:"紧急"}]
},
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="removeRow(\'' + row.materialNo + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
}
]
};
$.table.init(options);
})
function queryParams(params) {
var curParams = {
// 传递参数查询参数
salesOrderCode: sysSalesOrder.salesOrderCode
};
return curParams;
}
</script>
</body>
</html>

86
ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersalesMaterialSelect.html

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:include="include :: header('发起售后选择物料信息列表')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-startAftersalesMaterialSelect-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var prefix = ctx + "sales/afterSalesNotice";
// 从后端拿到传入的makeNo
var salesOrderCode = /*[[${salesOrderCode}]]*/ '';
$(function() {
var options = {
id: 'bootstrap-startAftersalesMaterialSelect-table',
clickToSelect: true, // 点击选中行
singleSelect: true, // 单选
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
pagination: false, // 设置不分页
url: prefix + "/getMaterialInfoBySalesOrderCode",
queryParams:queryParams,
modalName: "物料信息",
columns: [{
checkbox: true
},
{
title: '料号',
field: 'materialNo',
},
{
title: '图片',
field: 'materialPhotourl',
},
{
title: '物料名称',
field: 'materialName',
},
{
title: '类型',
field: 'materialType',
},
{
title: '描述',
field: 'materialDescribe',
},
{
title: '品牌',
field: 'materialBrand',
},
{
title: '单位',
field: 'materialUnit',
},
{
title: '半成品类型',
field: 'materialProcessMethod',
},
{
title: '已出库数量',
field: 'shippedGoodsSum'
}
]
};
$.table.init(options);
});
function queryParams(params) {
var curParams = {
// 现在使用从Thymeleaf传过来的makeNo
salesOrderCode: salesOrderCode
};
return curParams;
}
</script>
</body>
</html>
Loading…
Cancel
Save