Browse Source

[feat]

生产管理 生产订单
修改工程审核页面,添加审批意见和审批备注表单元素;
修改表格定义,去除编辑bom按钮,修改提交函数,序列化表单信息提交后台;
修改生产订单列表页面表格,新增编辑生产bom按钮及其权限定义;
新增编辑生产bom页面;
修改生产订单实体类,新增工程审核状态和工程审核备注字段;
新增跳转编辑生产bom页面controller接口和编辑保存生产bom接口;
修改部门领导确认service方法,工程部门领导确认后状态改为待编辑生产bom;
修改工程审核service方法,根据页面审核意见不同设置生产状态为待编辑bom和待采购审核;
新增编辑生产bom保存service方法;
修改生产订单mapper相应方法,新增字段;
dev
王晓迪 2 months ago
parent
commit
78eee31401
  1. 31
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysMakeOrderController.java
  2. 23
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysMakeOrder.java
  3. 144
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysMakeOrderServiceImpl.java
  4. 6
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysMakeorderDeptServiceImpl.java
  5. 11
      ruoyi-admin/src/main/resources/mapper/system/SysMakeOrderMapper.xml
  6. 505
      ruoyi-admin/src/main/resources/templates/system/makeorder/editBom.html
  7. 292
      ruoyi-admin/src/main/resources/templates/system/makeorder/gcsh.html
  8. 5
      ruoyi-admin/src/main/resources/templates/system/makeorder/makeorder.html

31
ruoyi-admin/src/main/java/com/ruoyi/system/controller/SysMakeOrderController.java

@ -679,4 +679,35 @@ public class SysMakeOrderController extends BaseController
}
/**
* 跳转编辑生产bom页面
*/
@GetMapping("/editBom/{id}")
public String editBom(@PathVariable("id") Long id, ModelMap mmap)
{
mmap.put("currentUser", ShiroUtils.getSysUser());
SysMakeOrder sysMakeOrder = sysMakeOrderService.selectSysMakeOrderById(id);
SysSalesOrder sysSalesOrder = salesOrderService.selectSysSalesOrderBySalesOrderCode(sysMakeOrder.getSaleNo());
if(StringUtils.isNotNull(sysSalesOrder)){
sysMakeOrder.setOrderType(sysSalesOrder.getSalesOrderType());
sysMakeOrder.setSalesman(sysSalesOrder.getBusinessMembers());
sysMakeOrder.setCustomerName(sysSalesOrder.getEnterpriseName());
sysMakeOrder.setCustomerId(sysSalesOrder.getEnterpriseCode());
sysMakeOrder.setCustomerOderCode(sysSalesOrder.getSalesOrderNumber());
}
mmap.put("sysMakeOrder", sysMakeOrder);
return prefix + "/editBom";
}
/**
* 编辑保存生产bom
*/
@RequiresPermissions("system:makeorder:editBom")
@PostMapping("/editBom")
@ResponseBody
public AjaxResult editBomSave(@RequestBody SysMakeOrder sysMakeOrder){
sysMakeOrderService.editBomSave(sysMakeOrder);
return AjaxResult.success("编辑成功!");
}
}

23
ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysMakeOrder.java

@ -115,6 +115,13 @@ public class SysMakeOrder extends BaseEntity
@Excel(name = "更新时间",sort = 17,dateFormat = "yyyy-MM-dd")
private Date updateTime;
/** 工程审核状态 */
private String gcReviewStatus;
/** 工程审核备注 */
private String comment;
private List<SysMakeorderBom> sysMakeorderBomList;
public void setId(Long id)
@ -356,6 +363,22 @@ public class SysMakeOrder extends BaseEntity
this.updateTime = updateTime;
}
public String getGcReviewStatus() {
return gcReviewStatus;
}
public void setGcReviewStatus(String gcReviewStatus) {
this.gcReviewStatus = gcReviewStatus;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

144
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysMakeOrderServiceImpl.java

@ -372,78 +372,20 @@ public class SysMakeOrderServiceImpl implements ISysMakeOrderService
makeorderBom.setCreateTime(DateUtils.getNowDate());
return makeorderBom;
}
/** 工程审核*/
@Override
@Transactional(rollbackFor = Exception.class)
public void gcReview(SysMakeOrder sysMakeOrder) {
String makeNo = sysMakeOrder.getMakeNo();
String salesOrderCode = sysMakeOrder.getSaleNo();
List<SysMakeorderBom> makeorderBoms = sysMakeOrder.getSysMakeorderBomList();
/*
* 获取前端返回生产bom列表0阶料号合集(只返回有修改的bom)*/
Set<String> uniqueMaterialNos = new HashSet<>();
for (SysMakeorderBom bom : makeorderBoms) {
uniqueMaterialNos.add(bom.getSalesOrderMaterialNo());
}
/*
* 获取该生产订单关联销售订单中的0阶物料存在bom*/
/*SysSalesOrderChild tempChild = new SysSalesOrderChild();
tempChild.setQuoteId(salesOrderCode);
List<SysSalesOrderChild> salesOrderChildList = salesOrderChildService.selectSysSalesOrderChildListWithBom(tempChild);
*/
/*
* 获取该生产订单关联销售订单中的0阶物料存在bom*/
SysMakeorderBom tempMakeorderBom = new SysMakeorderBom();
tempMakeorderBom.setMakeNo(makeNo);
tempMakeorderBom.setSalesOrderCode(salesOrderCode);
tempMakeorderBom.setLevel(0L);
List<SysMakeorderBom> tempBomList = makeorderBomService.selectSysMakeorderBomList(tempMakeorderBom);
/*
* 比对获取前端未修改过的bom料号后续查找生产bom表看其子阶是否为空,另外要去除加工类型为采购的数据*/
List<String> filteredList = tempBomList.stream()
.filter(child -> !uniqueMaterialNos.contains(child.getMaterialNo()))
.filter(child -> child.getMaterialNo().startsWith("5")||child.getMaterialNo().startsWith("6")
||child.getMaterialNo().startsWith("7")||child.getMaterialNo().startsWith("8")
||child.getMaterialNo().startsWith("9"))
.filter(child -> !child.getProcessMethod().equals("0"))
.map(SysMakeorderBom::getMaterialNo)
.collect(Collectors.toList());
/*
* 判断bom是否为空*/
if(StringUtils.isNotEmpty(filteredList)){
for (String code:filteredList) {
SysMakeorderBom tempMakeBom = new SysMakeorderBom();
tempMakeBom.setMakeNo(makeNo);
tempMakeBom.setSalesOrderCode(salesOrderCode);
tempMakeBom.setSalesOrderMaterialNo(code);
List<SysMakeorderBom> makeorderBomList = makeorderBomService.selectSysMakeorderBomList(tempMakeBom);
if(StringUtils.isEmpty(makeorderBomList)){
throw new BusinessException(code + "BOM不能为空");
}
}
String gcVerifyStatus = sysMakeOrder.getGcReviewStatus();
if(gcVerifyStatus.equals("true")){
sysMakeOrder.setMakeStatus("7");// 待采购审核
}else if(gcVerifyStatus.equals("false")){
sysMakeOrder.setMakeStatus("8");// 待编辑生产bom
}
/*
* 删除返回0阶料号的原有bom*/
for (String materialNo:uniqueMaterialNos) {
SysMakeorderBom tempBom = new SysMakeorderBom();
tempBom.setMakeNo(makeNo);
tempBom.setSalesOrderCode(salesOrderCode);
tempBom.setSalesOrderMaterialNo(materialNo);
makeorderBomMapper.deleteSysMakeorderBomByNos(tempBom);
}
Long sortNo = 0L;
for (SysMakeorderBom makeBom:makeorderBoms) {
sortNo ++;
makeBom.setSortNo(sortNo);
int insertResult = makeorderBomMapper.insertSysMakeorderBom(makeBom);
if(insertResult<=0){
throw new BusinessException("bom"+makeBom.getSalesOrderMaterialNo()+"层级添加失败!");
}
}
// 待采购审核
sysMakeOrder.setMakeStatus("7");
sysMakeOrder.setUpdateBy(ShiroUtils.getLoginName());
sysMakeOrder.setUpdateTime(DateUtils.getNowDate());
updateByMakeNo(sysMakeOrder);
// todo 加工方式“采购”的物料生成采购计划
// purchasePlanService.generatePurchasePlanByMakeOrder(insertedSysMakeorderBoms);
}
/*
@ -853,6 +795,8 @@ public class SysMakeOrderServiceImpl implements ISysMakeOrderService
detail.setOutsourceProcessType(materials.size());
detail.setOutsourceProcessAmount(materials.size());
processAmount += detail.getOutsourceProcessAmount();
detail.setActualOutsourceAmount(0);
detail.setOutPlanStatus("0");
int insertResult = outsourcePlanMapper.insertOutsourcePlanDetail(detail);
if(insertResult <= 0){
throw new BusinessException("添加委外计划详情失败!");
@ -905,4 +849,70 @@ public class SysMakeOrderServiceImpl implements ISysMakeOrderService
return updateResult;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void editBomSave(SysMakeOrder sysMakeOrder) {
String makeNo = sysMakeOrder.getMakeNo();
String salesOrderCode = sysMakeOrder.getSaleNo();
List<SysMakeorderBom> makeorderBoms = sysMakeOrder.getSysMakeorderBomList();
/*
* 获取前端返回生产bom列表0阶料号合集(只返回有修改的bom)*/
Set<String> uniqueMaterialNos = new HashSet<>();
for (SysMakeorderBom bom : makeorderBoms) {
uniqueMaterialNos.add(bom.getSalesOrderMaterialNo());
}
/*
* 获取该生产订单关联销售订单中的0阶物料存在bom*/
SysMakeorderBom tempMakeorderBom = new SysMakeorderBom();
tempMakeorderBom.setMakeNo(makeNo);
tempMakeorderBom.setSalesOrderCode(salesOrderCode);
tempMakeorderBom.setLevel(0L);
List<SysMakeorderBom> tempBomList = makeorderBomService.selectSysMakeorderBomList(tempMakeorderBom);
/*
* 比对获取前端未修改过的bom料号后续查找生产bom表看其子阶是否为空,另外要去除加工类型为采购的数据*/
List<String> filteredList = tempBomList.stream()
.filter(child -> !uniqueMaterialNos.contains(child.getMaterialNo()))
.filter(child -> child.getMaterialNo().startsWith("5")||child.getMaterialNo().startsWith("6")
||child.getMaterialNo().startsWith("7")||child.getMaterialNo().startsWith("8")
||child.getMaterialNo().startsWith("9"))
.filter(child -> !child.getProcessMethod().equals("0"))
.map(SysMakeorderBom::getMaterialNo)
.collect(Collectors.toList());
/*
* 判断bom是否为空*/
if(StringUtils.isNotEmpty(filteredList)){
for (String code:filteredList) {
SysMakeorderBom tempMakeBom = new SysMakeorderBom();
tempMakeBom.setMakeNo(makeNo);
tempMakeBom.setSalesOrderCode(salesOrderCode);
tempMakeBom.setSalesOrderMaterialNo(code);
List<SysMakeorderBom> makeorderBomList = makeorderBomService.selectSysMakeorderBomList(tempMakeBom);
if(StringUtils.isEmpty(makeorderBomList)){
throw new BusinessException(code + "BOM不能为空");
}
}
}
/*
* 删除返回0阶料号的原有bom*/
for (String materialNo:uniqueMaterialNos) {
SysMakeorderBom tempBom = new SysMakeorderBom();
tempBom.setMakeNo(makeNo);
tempBom.setSalesOrderCode(salesOrderCode);
tempBom.setSalesOrderMaterialNo(materialNo);
makeorderBomMapper.deleteSysMakeorderBomByNos(tempBom);
}
Long sortNo = 0L;
for (SysMakeorderBom makeBom:makeorderBoms) {
sortNo ++;
makeBom.setSortNo(sortNo);
int insertResult = makeorderBomMapper.insertSysMakeorderBom(makeBom);
if(insertResult<=0){
throw new BusinessException("bom"+makeBom.getSalesOrderMaterialNo()+"层级添加失败!");
}
}
// 待工程审核
sysMakeOrder.setMakeStatus("2");
updateByMakeNo(sysMakeOrder);
}
}

6
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/SysMakeorderDeptServiceImpl.java

@ -231,12 +231,12 @@ public class SysMakeorderDeptServiceImpl implements ISysMakeorderDeptService
throw new BusinessException("有物料数据未被确认,请进行部门主管确认!");
}
// 工程部门领导确认完,生产状态更新为待工程审核
// 工程部门领导确认完,生产状态更新为待编辑生产bom
if ("END".equals(deptNumber)) {
SysMakeOrder makeOrder = new SysMakeOrder();
makeOrder.setMakeNo(makeNo);
// 待工程审核
makeOrder.setMakeStatus("2");
// 待编辑生产bom
makeOrder.setMakeStatus("8");//编辑生产bom
makeOrderService.updateByMakeNo(makeOrder);
}
// 采购部门领导确认完,采购确认状态更新为已确认

11
ruoyi-admin/src/main/resources/mapper/system/SysMakeOrderMapper.xml

@ -12,7 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="useStatus" column="use_status" />
<result property="makeNo" column="makeNo" />
<result property="saleNo" column="saleNo" />
<result property="Salesman" column="Salesman" />
<!-- <result property="Salesman" column="Salesman" />-->
<result property="orderType" column="order_type" />
<result property="customerId" column="customerId" />
<result property="customerName" column="customerName" />
@ -29,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="delFlag" column="del_flag" />
<result property="comment" column="comment" />
<result property="deptNumber" column="dept_number" />
<result property="purchaseStatus" column="purchase_status" />
@ -37,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectSysMakeOrderVo">
select a.id, a.make_status, a.eceipt_status, a.quality_status, a.use_status, a.makeNo, a.saleNo, a.Salesman, a.customerId, a.customerName, a.customerOderCode, a.material
, a.materialSum, a.finishNum, a.eceiptNum, a.noRate, a.rate, a.order_type
, a.materialSum, a.finishNum, a.eceiptNum, a.noRate, a.rate, a.order_type, a.comment
, a.create_by, a.create_time, a.update_by, a.update_time, a.remark, a.del_flag,a.purchase_status
from sys_makeorder a
</sql>
@ -45,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectSysMakeOrderList" parameterType="SysMakeOrder" resultMap="SysMakeOrderResult">
select a.id, a.make_status, a.eceipt_status, a.quality_status, a.use_status, a.makeNo, a.saleNo,
a.Salesman, a.customerId, a.customerName, a.customerOderCode, a.material, a.order_type
, a.materialSum, a.finishNum, a.eceiptNum, a.noRate, a.rate, a.purchase_status
, a.materialSum, a.finishNum, a.eceiptNum, a.noRate, a.rate, a.purchase_status, a.comment
, a.create_by, a.create_time, a.update_by, a.update_time, a.remark, a.del_flag
, b.dept_leader_confirm_status
from sys_makeorder a
@ -103,6 +104,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
<if test="delFlag != null">del_flag,</if>
<if test="comment != null">comment,</if>
<if test="purchaseStatus != null">purchase_status,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
@ -129,6 +131,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="comment != null">#{comment},</if>
<if test="purchaseStatus != null">#{purchaseStatus},</if>
</trim>
</insert>
@ -159,6 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="comment != null">comment = #{comment},</if>
<if test="purchaseStatus != null">purchase_status = #{purchaseStatus},</if>
</trim>
where id = #{id}
@ -207,6 +211,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="comment != null">comment = #{comment},</if>
<if test="purchaseStatus != null">purchase_status = #{purchaseStatus},</if>
</trim>
where makeNo = #{makeNo}

505
ruoyi-admin/src/main/resources/templates/system/makeorder/editBom.html

@ -0,0 +1,505 @@
<!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-makeorder-edit" th:object="${sysMakeOrder}">
<input name="id" th:field="*{id}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">生产订单号:</label>
<div class="col-sm-8">
<input readonly id="makeNo" name="makeNo" th:field="*{makeNo}" 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 readonly id="saleNo" name="saleNo" th:field="*{saleNo}" 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 readonly name="Salesman" th:field="*{Salesman}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">订单类型:</label>
<div class="col-sm-8">
<select disabled name="orderType" class="form-control" type="text" th:with="dictList=${@dict.getType('sys_order_type')}" required th:field="*{orderType}">
<option value="">请选择</option>
<option th:each="dict : ${dictList}" th:value="${dict.dictValue}" th:text="${dict.dictLabel}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">审批备注:</label>
<div class="col-sm-8">
<textarea name="comment" class="form-control" th:text="*{comment}" readonly></textarea>
</div>
</div>
<div class="col-xs-11" style="margin-left: 50px;">
<div class="form-group-sm">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-1"></table>
</div>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:inline="javascript">
var prefix = ctx + "system/makeorder";
var curUser = [[${currentUser}]];
// var curUsrDeptNumber = curUser.dept.deptNumber;
// 字典
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var levelDatas = [[${@dict.getType('bomLevel')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var makeNo = [[${sysMakeOrder.makeNo}]];
var makeOrderBom = {};
// var subTableFormArray = [];
$(function(){
sessionStorage.clear();
var options = {
url: ctx + "system/makeorderbom/selectedList",
id: 'bootstrap-sub-table-1',
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
uniqueId: "id",
pagination: false, // 设置不分页
sidePagination: "client",
queryParams: queryParams,
detailView: true,
onExpandRow : function(index, row, $detail) {
initChildTable(index, row, $detail);
},
/*onCollapseRow: function(index, row){
var childTableFormId = 'child_table_form_'+index;
var formData = $('#'+childTableFormId).serialize();
var formObj = $.common.formDataToObj(formData);
subTableFormArray.push(formObj);
},*/
columns: [
{
field: 'id',
title: '主键id',
visible: false
},
{
field: 'quoteId',
title: '关联销售订单编号',
visible: false
},
{
field: 'bomId',
title: 'bom主键Id',
visible: false
},
{
field: 'materialNo',
align: 'center',
title: '料号'
},
{
field: 'materialName',
align: 'center',
title: '物料名称',
},
{
field: 'materialType',
align: 'center',
title: '物料类型',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{
field: 'unit',
align: 'center',
title: '单位',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{
field: 'brand',
align: 'center',
title: '品牌'
},
{
field: 'materialModel',
align: 'center',
title: '型号'
},
{
field: 'describe',
align: 'center',
title: '描述'
},
{
field: 'processMethod',
align: 'center',
title: '加工方式',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{
field: 'deliveryTime',
align: 'center',
title: '客户期望交付时间'
},
{
field: 'orderNum',
align: 'center',
title: '订单数量'
},
{
field: 'useStatus',
align: 'center',
title: '使用状态',
visible: false
},
{
field: 'auditStatus',
align: 'center',
title: '审核状态',
visible: false
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="editMakeOrderBom(\'' + index + '\',\'' +row.materialNo + '\')">编辑生产bom</a> ');
return actions.join('');
}
},
]
};
$.table.init(options);
})
initChildTable = function(index, row, $detail) {
var parentRow = row;
var parentRowIndex = index;
var childTableId = 'child_table_'+index;
var childFormTableId = 'child_form_table_'+index;
var childTableFormId = 'child_table_form_'+index;
// $detail.html('<form id="'+childTableFormId+'"><table id="'+childTableId+'"></table><table id="'+childFormTableId+'"></table></form>');
$detail.html('<table id="'+childTableId+'"></table><table id="'+childFormTableId+'"></table>');
// BOM展示
$('#'+childTableId).bootstrapTable({
url: ctx + "system/makeorderbom/list",
method: 'post',
sidePagination: "server",
contentType: "application/x-www-form-urlencoded",
queryParams : {
salesOrderMaterialNo: parentRow.materialNo,
makeNo: makeNo,
},
columns: [{
field: 'id',
title: '主键id',
visible: false
},
{
field: 'level',
title: '阶层',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(levelDatas, value);
}
},
{
field: 'bomNo',
align: 'center',
title: 'BOM号',
formatter:function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'materialNo',
align: 'center',
title: '料号',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'photoUrl',
align: 'center',
title: '图片',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{
field: 'materialName',
align: 'center',
title: '物料名称',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'materialType',
align: 'center',
title: '物料类型',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{
field: 'materialModel',
align: 'center',
title: '型号'
},
{
field: 'describe',
align: 'center',
title: '描述',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'brand',
align: 'center',
title: '品牌',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'unit',
align: 'center',
title: '单位',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'processMethod',
align: 'center',
title: '加工方式',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{
field: 'useNum',
align: 'center',
title: '用量',
formatter: function (value,row,index){
if (value == null || value == ''){
return '/';
}else{
return value
}
}
},
{
field: 'lossRate',
align: 'center',
title: '损耗率',
formatter: function (value, row, index) {
if (value == null || value == ''){
return "0.00%";
}
value = parseFloat(value).toFixed(2);
return value + "%";
}
},
{
field: 'materialNum',
align: 'center',
title: '订单用量',
formatter: function (value,row,index){
return parentRow.orderNum * row.useNum;
}
},
{
field: 'parentId',
title: '父级id',
visible: false,
},
{
field: 'sortNo',
title: '排序',
visible: false
}],
// 当所有数据被加载时触发
onLoadSuccess: function(data) {
var key = "all_level_" + childTableId;
var rowData = sessionStorage.getItem(key);
if(rowData){
var tableData = JSON.parse(rowData);
$("#"+childTableId).bootstrapTable('load',tableData);
}
},
});
};
function queryParams(params) {
var curParams = {
};
// 额外传参
curParams.makeNo = $("#makeNo").val();
curParams.level = 0;
return curParams;
}
$("#form-makeorder-edit").validate({
focusCleanup: true
});
function submitHandler() {
// debugger
// var data = $("#form-makeorder-edit").serializeArray();
var saleNo = $("#saleNo").val();
var makeNo = $("#makeNo").val();
let makeOrderBomList = [];
var keyPre = 'all_level_child_table_';
const length = sessionStorage.length;
for (let i = 0; i < length; i++) {
const key = sessionStorage.key(i);
if (key.startsWith(keyPre)) {
var rows = sessionStorage.getItem(key);
var rowData = JSON.parse(rows);
rowData.forEach(function (value){
makeOrderBomList.push(value);
})
}
}
var sysMakeOrder = {
makeNo: makeNo,
saleNo: saleNo,
sysMakeorderBomList: makeOrderBomList,
}
$.operate.saveJson(prefix + "/editBom", JSON.stringify(sysMakeOrder));
}
function editMakeOrderBom(curIndex,materialNo){
var url = ctx + "system/makeorderbom/editMakeorderBom?materialNo=" + materialNo+"&curIndex="+curIndex+"&makeNo="+makeNo;
var options = {
title: '编辑生产bom',
url: url,
callBack: handleMakeOrderBomData
};
$.modal.openOptions(options);
}
function handleMakeOrderBomData(index, layero){
var iframeWin = window[layero.find('iframe')[0]['name']];
iframeWin.$('#materialNo').removeAttr("disabled");
var materialNo = iframeWin.$('#materialNo').val();
var curIndex = iframeWin.$('#curIndex').val();
var saleNo = $("#saleNo").val();
var makeNo = $("#makeNo").val();
var tableData = iframeWin.$('#bootstrap-sub-table-1').bootstrapTable('getData');
if (tableData.length===0){
$.modal.alertWarning("请至少添加一条bom信息再保存!");
return;
}
var bomData = [];
var oneLevelKey = "one_level_child_table_"+curIndex;
var allLevelKey = "all_level_child_table_"+curIndex;
var formData = [];
for(var i=0;i<tableData.length;i++){
tableData[i].salesOrderMaterialNo = materialNo;
tableData[i].makeNo = makeNo;
tableData[i].salesOrderCode = saleNo;
if(tableData[i].useNum == null || tableData[i].useNum == ''){
$.modal.alertWarning("子表数据用量不能为空!");
return;
}
formData.push(tableData[i].materialNo);
}
materialNos = JSON.stringify(formData);
// 创建一个 bomData 对象,用于快速查找
var bomData = {};
for (var i = 0; i < formData.length; i++) {
bomData[formData[i]] = tableData[i];
}
//根据修改页面返回的一阶bom,后台查找所有阶bom,如果bom表中没有,说明该物料未被添加为bom
//则返回一个只有料号数据的一阶bom空对象,页面做对比将后端返回数组中的一阶bom替换成修改页面返回的一阶bom
$.ajax({
url: ctx + "erp/bom/makeOrderAllList",
cache: false,
data: materialNos,
contentType: "application/json",
processData: false,
type: 'POST',
success: function (result) {
var rowData = result.rows;
// 遍历 result 数组,替换匹配的料号
for (var j = 0; j < rowData.length; j++) {
rowData[j].salesOrderMaterialNo = materialNo;
rowData[j].makeNo = makeNo;
rowData[j].salesOrderCode = saleNo;
//替换一阶物料
if (bomData[rowData[j].materialNo] && rowData[j].level == '1') {
rowData[j] = bomData[rowData[j].materialNo];
}
}
$("#child_table_"+curIndex).bootstrapTable('load',result.rows);
sessionStorage.setItem(allLevelKey,JSON.stringify(result.rows));
}
});
sessionStorage.setItem(oneLevelKey,JSON.stringify(tableData));
layer.close(index);
}
</script>
</body>
</html>

292
ruoyi-admin/src/main/resources/templates/system/makeorder/gcsh.html

@ -6,7 +6,7 @@
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-makeorder-edit" th:object="${sysMakeOrder}">
<form class="form-horizontal m" id="form-makeorder-gcsh" th:object="${sysMakeOrder}">
<input name="id" th:field="*{id}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">生产订单号:</label>
@ -36,6 +36,24 @@
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">审批意见:</label>
<div class="col-sm-8">
<select name="gcReviewStatus" id="gcReviewStatus" 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-3 control-label">审批备注:</label>
<div class="col-sm-8">
<textarea name="comment" class="form-control"></textarea>
</div>
</div>
<div class="col-xs-11" style="margin-left: 50px;">
<div class="form-group-sm">
<div class="col-sm-12 select-table table-striped">
@ -59,7 +77,6 @@
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var levelDatas = [[${@dict.getType('bomLevel')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var makeNo = [[${sysMakeOrder.makeNo}]];
var makeOrderBom = {};
@ -175,15 +192,6 @@
title: '审核状态',
visible: false
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="editMakeOrderBom(\'' + index + '\',\'' +row.materialNo + '\')">编辑生产bom</a> ');
return actions.join('');
}
},
]
};
$.table.init(options);
@ -364,164 +372,7 @@
title: '排序',
visible: false
}],
// 当所有数据被加载时触发
onLoadSuccess: function(data) {
var key = "all_level_" + childTableId;
var rowData = sessionStorage.getItem(key);
if(rowData){
var tableData = JSON.parse(rowData);
$("#"+childTableId).bootstrapTable('load',tableData);
}
},
});
// 预审部门展示
// $('#'+childFormTableId).bootstrapTable({
// url: ctx + "system/makeorderdept/list",
// method: 'post',
// sidePagination: "server",
// contentType: "application/x-www-form-urlencoded",
// queryParams : {
// makeNo: $("#makeNo").val(),
// materialNo: parentRow.materialCode
// },
// columns: [
// {
// field : 'id',
// title : '生产订单部门ID',
// formatter: function (value, row, index) {
// var curIndex = parentRowIndex*6+index;
// return '<input disabled class = "form-control" data-id = "id_'+curIndex+'" name="orderDepts['+curIndex+'].id" value="'+value+'"></input>';
// }
// },
// {
// field : 'makeNo',
// title : '生产订单号',
// visible: false,
// formatter: function (value, row, index) {
// var curIndex = parentRowIndex*6+index;
// return '<input disabled class = "form-control" data-id = "id_'+curIndex+'" name="orderDepts['+curIndex+'].makeNo" value="'+value+'">';
// }
// },
// {
// field : 'materialNo',
// title : '料号',
// visible: false,
// formatter: function (value, row, index) {
// var curIndex = parentRowIndex*6+index;
// return '<input disabled class = "form-control" data-id = "id_'+curIndex+'" name="orderDepts['+curIndex+'].materialNo" value="'+value+'">';
// }
// },
// {
// field : 'deptName',
// title : '部门名称',
// visible: false
// },
// {
// field : 'planFinishDays',
// title : '计划完成天数',
// visible: false
// },
// {
// field : 'actualFinishStartTime',
// title : '实际完成开始时间',
// visible: false
// },
// {
// field : 'actualFinishEndTime',
// title : '实际完成结束时间',
// visible: false
// },
// {
// field : 'deptNumber',
// title : '部门',
// formatter: function (value, row, index) {
// /*if(subTableFormArray[parentRowIndex]){
// value = subTableFormArray[parentRowIndex].deptName?subTableFormArray[parentRowIndex].deptName:value;
// }*/
// var curIndex = parentRowIndex*6+index;
// return '<input disabled class = "form-control" data-id = "deptName_'+curIndex+'" name="orderDepts['+curIndex+'].deptName" value="'+row.deptName+'"><input disabled class = "form-control hidden" data-id = "deptNumber_'+curIndex+'" name="orderDepts['+curIndex+'].deptNumber" value="'+value+'">';
// }
// },
// {
// field: 'planFinishDate',
// title: '计划完成时间',
// formatter: function(value, row, index) {
// var curIndex = parentRowIndex*6+index;
// var endDateName = 'planFinishEndDate_'+parentRowIndex;
// var startDateName = 'planFinishStartDate_'+parentRowIndex;
// var html;
// // 业务部门
// if(row.deptNumber=='GMD'){
// html = '<div class="input-daterange input-group">' +
// '<input disabled type="text" class="form-control" data-id="'+startDateName+'" name ="orderDepts['+curIndex+'].planFinishStartDate" placeholder="开始时间" value="'+row.planFinishStartDate+'"/>\n' +
// '<span class="input-group-addon">-</span>\n' +
// '<input disabled type="text" class="form-control" data-id="'+endDateName+'" name="orderDepts['+curIndex+'].planFinishEndDate" placeholder="结束时间" value="'+row.planFinishEndDate+'"/></div>'
// }else{
// html = '<input disabled class = "form-control" data-id = "planFinishDays_'+curIndex+'" name="orderDepts['+curIndex+'].planFinishDays" value="'+row.planFinishDays+'">';
// }
// return html;
// }
// },
// {
// field : 'deptLeaderConfirmStatus',
// title : '部门主管确认',
// formatter: function(value, row, index) {
// var curIndex = parentRowIndex*6+index;
// var html = '<select disabled class="form-control" name="orderDepts['+curIndex+'].deptLeaderConfirmStatus">' +
// '<option value="0" '+(value=='0'?'selected':"")+'>待确认</option>' +
// '<option value="1" '+(value=='1'?'selected':"")+'>已确认</option>' +
// '</select>';
// return html;
// }
// },
// {
// field: 'actualFinishTime',
// title: '实际完成时间',
// formatter: function(value, row, index) {
// if (row.actualFinishStartTime == null || row.actualFinishStartTime == ''){
// return '';
// }else if(row.actualFinishStartTime){
// return row.actualFinishStartTime
// }else if(row.actualFinishStartTime && row.actualFinishEndTime){
// return row.actualFinishStartTime + '-' + row.actualFinishEndTime
// }
// }
// }
// ],
// // 当所有数据被加载时触发
// onLoadSuccess: function(data) {
// for (let i = 0; i < data.rows.length; i++) {
// var curIndex = parentRowIndex*6+i;
// var startDateIndex = 'planFinishStartDate_'+i;
// var endDateIndex = 'planFinishEndDate_'+i;
//
// $('[data-id="'+startDateIndex+'"]').datetimepicker({
// format: 'yyyy-mm-dd',
// minView: "month",
// todayBtn: true,
// autoclose: true,
// }).on('changeDate', function(event) {
// event.preventDefault();
// event.stopPropagation();
// var startTime = event.date;
// $('[data-id="'+endDateIndex+'"]').datetimepicker('setStartDate', startTime);
// });
// $('[data-id="'+endDateIndex+'"]').datetimepicker({
// format: 'yyyy-mm-dd',
// minView: "month",
// todayBtn: true,
// autoclose: true,
// }).on('changeDate', function(event) {
// event.preventDefault();
// event.stopPropagation();
// var endTime = event.date;
// $('[data-id="'+startDateIndex+'"]').datetimepicker('setEndDate', endTime);
// });
//
// }
//
// },
// });
};
function queryParams(params) {
@ -539,106 +390,17 @@
});
function submitHandler() {
// debugger
// var data = $("#form-makeorder-edit").serializeArray();
var saleNo = $("#saleNo").val();
var makeNo = $("#makeNo").val();
let makeOrderBomList = [];
var keyPre = 'all_level_child_table_';
const length = sessionStorage.length;
for (let i = 0; i < length; i++) {
const key = sessionStorage.key(i);
if (key.startsWith(keyPre)) {
var rows = sessionStorage.getItem(key);
var rowData = JSON.parse(rows);
rowData.forEach(function (value){
makeOrderBomList.push(value);
})
}
}
var sysMakeOrder = {
makeNo: makeNo,
saleNo: saleNo,
sysMakeorderBomList: makeOrderBomList,
}
$.operate.saveJson(prefix + "/gcReview", JSON.stringify(sysMakeOrder));
}
const sysMakeOrder = $("#form-makeorder-gcsh").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
function editMakeOrderBom(curIndex,materialNo){
var url = ctx + "system/makeorderbom/editMakeorderBom?materialNo=" + materialNo+"&curIndex="+curIndex+"&makeNo="+makeNo;
var options = {
title: '编辑生产bom',
url: url,
callBack: handleMakeOrderBomData
};
$.modal.openOptions(options);
}
function handleMakeOrderBomData(index, layero){
var iframeWin = window[layero.find('iframe')[0]['name']];
iframeWin.$('#materialNo').removeAttr("disabled");
var materialNo = iframeWin.$('#materialNo').val();
var curIndex = iframeWin.$('#curIndex').val();
var saleNo = $("#saleNo").val();
var makeNo = $("#makeNo").val();
var tableData = iframeWin.$('#bootstrap-sub-table-1').bootstrapTable('getData');
if (tableData.length===0){
$.modal.alertWarning("请至少添加一条bom信息再保存!");
if(sysMakeOrder.gcReviewStatus === "" || sysMakeOrder.gcReviewStatus === null
|| sysMakeOrder.gcReviewStatus === undefined){
$.modal.msgError("请选择审批意见!");
return;
}
var bomData = [];
var oneLevelKey = "one_level_child_table_"+curIndex;
var allLevelKey = "all_level_child_table_"+curIndex;
var formData = [];
for(var i=0;i<tableData.length;i++){
tableData[i].salesOrderMaterialNo = materialNo;
tableData[i].makeNo = makeNo;
tableData[i].salesOrderCode = saleNo;
if(tableData[i].useNum == null || tableData[i].useNum == ''){
$.modal.alertWarning("子表数据用量不能为空!");
return;
}
formData.push(tableData[i].materialNo);
}
materialNos = JSON.stringify(formData);
// 创建一个 bomData 对象,用于快速查找
var bomData = {};
for (var i = 0; i < formData.length; i++) {
bomData[formData[i]] = tableData[i];
}
//根据修改页面返回的一阶bom,后台查找所有阶bom,如果bom表中没有,说明该物料未被添加为bom
//则返回一个只有料号数据的一阶bom空对象,页面做对比将后端返回数组中的一阶bom替换成修改页面返回的一阶bom
$.ajax({
url: ctx + "erp/bom/makeOrderAllList",
cache: false,
data: materialNos,
contentType: "application/json",
processData: false,
type: 'POST',
success: function (result) {
var rowData = result.rows;
// 遍历 result 数组,替换匹配的料号
for (var j = 0; j < rowData.length; j++) {
rowData[j].salesOrderMaterialNo = materialNo;
rowData[j].makeNo = makeNo;
rowData[j].salesOrderCode = saleNo;
//替换一阶物料
if (bomData[rowData[j].materialNo] && rowData[j].level == '1') {
rowData[j] = bomData[rowData[j].materialNo];
}
}
$("#child_table_"+curIndex).bootstrapTable('load',result.rows);
sessionStorage.setItem(allLevelKey,JSON.stringify(result.rows));
}
});
sessionStorage.setItem(oneLevelKey,JSON.stringify(tableData));
layer.close(index);
$.operate.saveJson(prefix + "/gcReview", JSON.stringify(sysMakeOrder));
}
</script>

5
ruoyi-admin/src/main/resources/templates/system/makeorder/makeorder.html

@ -107,6 +107,7 @@
var confirmFlag = [[${@permission.hasPermi('system:makeorder:confirm')}]];
var engineerFlag = [[${@permission.hasPermi('system:makeorder:engineer')}]];
var purchaseFlag = [[${@permission.hasPermi('system:makeorder:purchase')}]];
var editBomFlag = [[${@permission.hasPermi('system:makeorder:editBom')}]];
var makeStatusDatas = [[${@dict.getType('sys_erp_makeStatus')}]];
var eceiptStatusDatas = [[${@dict.getType('eceiptStatus')}]];
var qualityStatusDatas = [[${@dict.getType('qualityStatus')}]];
@ -274,6 +275,10 @@
if(row.makeStatus == '2'){
actions.push('<a class=" ' + engineerFlag + '" href="javascript:void(0)" onclick="$.modal.open(\'工程审核\',\'' + prefix+"/gcsh/"+row.id + '\')"><i class="fa fa-edit"></i>工程审核</a> ');
}
// 编辑生产bom
if(row.makeStatus == '8'){
actions.push('<a class=" ' + editBomFlag + '" href="javascript:void(0)" onclick="$.modal.open(\'编辑生产bom\',\'' + prefix+"/editBom/"+row.id + '\')"><i class="fa fa-edit"></i>编辑生产bom</a> ');
}
// 采购审核:生产状态-待采购审核,采购上级确认状态-已确认
if(row.makeStatus == '7'&&row.purchaseStatus == '1'){
actions.push('<a class="' + purchaseFlag + '" href="javascript:void(0)" onclick="$.modal.open(\'采购审核\',\'' + prefix+"/cgsh/"+row.id + '\')"><i class="fa fa-edit"></i>采购审核</a> ');

Loading…
Cancel
Save