流程卡分架界面,每次建立流程卡按顺序往下添加,流程卡分架界面添加根据情况按宽高排序,流程卡查询修改排版状态时,先查询当前状态再修改
7个文件已修改
373 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/lang/zh.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue 252 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/zh.js
@@ -525,7 +525,8 @@
        addFlowCardMsg2:'请选择未分架订单打印',
        okFlowCard:'已分架',
        noFlowCard:'未分架',
        mainWidth:'宽高',
        mainHeight:'高宽',
    },
    reportingWorks:{
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -2,7 +2,7 @@
import request from "@/utils/request"
import deepClone from "@/utils/deepClone"
import {ElDatePicker, ElMessage} from "element-plus"
import {ElCheckbox, ElDatePicker, ElMessage} from "element-plus"
import useProductGlassTypeStore from "@/stores/sd/product/productGlassType"
import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
import {ArrowLeftBold, Search} from "@element-plus/icons-vue"
@@ -33,6 +33,22 @@
  }
  flag = !flag
}
//倒叙
let  flashback = ref(1)
//定义排序规则
const optionVal = ref(0)
const options = [
  {
    value: 0,
    label: t('processCard.mainWidth'),
  },
  {
    value: 1,
    label: t('processCard.mainHeight'),
  },
]
//定义时间
const form = reactive({
@@ -101,6 +117,10 @@
    })
    produceList = produceList.value.concat(deepClone(res.data.data))
    produceList.forEach(item => {
      // 如果 shape 可能是字符串就用 ==,如果一定是数字就用 ===
      item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
    });
    xGrid.value.reloadData(produceList)
    gridOptions.loading = false
  } else {
@@ -263,9 +283,12 @@
  ],//表头按钮
  toolbarConfig: {
    // buttons: [{
    //
    // }],
    slots:{
      buttons: "toolbar_buttons"
    },
    buttons: [{
    }],
    // import: false,
    // export: true,
    // print: true,
@@ -300,6 +323,49 @@
})
const gridEventsRight = {
  toolbarButtonClick({code}) {
    const $grid = xGridLeft.value
    if ($grid) {
      switch (code) {
        case 'sorting': {
          request.post(`/processCard/selectSortingCard/${orderId}/${productionId}/${flashback.value}/${optionVal.value}`, filterData.value).then((res) => {
            if (res.code == 200) {
              pageTotal.value = res.data.total
              maxProcseeId=res.data.maxFlowCard[0].process_id
              orderOtherMoney.value = res.data.orderOtherMoney
              orderOtherMoney.value.forEach(item => {
                let column = {
                  field: `${item.column}`,
                  width: 100,
                  title: item.alias,
                  filters: [{data: ''}],
                  slots: {filter: 'num1_filter'},
                  filterMethod: filterChanged,
                  sortable: true
                }
                gridOptions.columns.push(column)
              })
              produceList = res.data.data
              produceList.forEach(item => {
                // 如果 shape 可能是字符串就用 ==,如果一定是数字就用 ===
                item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
              });
              xGrid.value.reloadData(produceList)
              gridOptions.loading = false
            } else {
              ElMessage.warning(res.msg)
            }
          })
          return;
        }
      }
    }
  },
  formSubmit () {
    let form = gridOptions.formConfig.data
    form.orderId =orderId
@@ -440,92 +506,89 @@
    ElMessage.warning(t('processCard.schedulingOk'))
    return
  }
  //productionId
  const $gridLeft = xGridLeft.value
  const leftData = $gridLeft.getTableData().fullData
  //落架顺序
  let index = 1
  if (leftData.length !== 0) {
    index = leftData[0].landingSequence + 1
    //index = index.toString().padStart(2, '0')
    index = Math.max(...leftData.map(d => d.landingSequence || 0)) + 1
  }
  let processId= null
  // if (leftData.length !== 0){
  //   processId = productionId + index.toString().padStart(3, '0')
  // }
  // else {
    if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){
      if (leftData.length !== 0){
        const str=leftData[0].processId
        const lastThree = str.slice(-3);
        const result =  lastThree*1 + 1;
        processId= productionId + result.toString().padStart(3, '0')
      }
      else {
        // 截取后三位
        const lastThree = maxProcseeId.slice(-3);
        const result =  lastThree*1 + 1;
        processId= productionId + result.toString().padStart(3, '0')
      }
    }
    else {
      processId = productionId + index.toString().padStart(3, '0')
    }
  //}
  // 流程卡号
  let processId = null
  if (maxProcseeId) {
    const base = leftData.length !== 0 ? leftData[0].processId : maxProcseeId
    const lastThree = base.slice(-3)
    const result = parseInt(lastThree) + 1
    processId = productionId + result.toString().padStart(3, '0')
  } else {
    processId = productionId + index.toString().padStart(3, '0')
  }
  const regex = /^(\d+|)$/;
  const regex = /^(\d+|)$/
  if (!regex.test(checkedNum.value)) {
    ElMessage.warning(t('processCard.schedulingNo'))
    return
  }
  //判断正整数
  if (/^[1-9]\d*$/.test(checkedNum.value)) {
    checkedList.forEach((item) => {
      //定义key值保持
      //判断可用数量是否大于等于输入的数量,不满足则抛出异常
      if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error(t('processCard.schedulingQuantity'));
      item.quantity = checkedNum.value
      item.processId = processId
      item.landingSequence = index
      item.baiscQuantity = item.baiscQuantity - checkedNum.value
      item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2)
      //删除key
      let key = item._X_ROW_KEY
      delete item._X_ROW_KEY
      if (item.baiscQuantity === 0) {
        $grid.remove(item)
      }
      $gridLeft.insertAt(item)
      //重新赋值key
      item._X_ROW_KEY = key
    })
  try {
    if (/^[1-9]\d*$/.test(checkedNum.value)) {
      //有输入数量
      checkedList.forEach((item) => {
        if (item.baiscQuantity < checkedNum.value * 1) {
          throw new Error(t('processCard.schedulingQuantity'))
        }
        item.quantity = checkedNum.value * 1
        item.processId = processId
        item.landingSequence = index  // ✅ 同一批次,落架顺序一致
        item.baiscQuantity -= checkedNum.value * 1
        item.computeGrossArea = (
            item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000
        ).toFixed(2)
    //清除两边复选框
        const key = item._X_ROW_KEY
        delete item._X_ROW_KEY
        if (item.baiscQuantity === 0) {
          $grid.remove(item)
        }
        const currentLeft = $gridLeft.getTableData().fullData
        $gridLeft.clearSort()
        $gridLeft.loadData([...currentLeft, item])
        item._X_ROW_KEY = key
      })
    } else if (checkedNum.value === '') {
      //没有输入数量
      checkedList.forEach((item) => {
        item.processId = processId
        item.landingSequence = index
        item.quantity = item.baiscQuantity
        delete item._X_ROW_KEY
      })
      $grid.remove(checkedList)
      const currentLeft = $gridLeft.getTableData().fullData
      $gridLeft.clearSort()
      $gridLeft.loadData([...currentLeft, ...checkedList])
    }
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  } else if (checkedNum.value === '') {//判断数量输入框无输入数字
    checkedNum.value = ''
    checkedList.forEach((item) => {
      item.processId = processId
      item.landingSequence = index
      item.quantity = item.baiscQuantity
    })
    //删除key
    checkedList.forEach((item) => {
      delete item._X_ROW_KEY
    })
    $gridLeft.insertAt(checkedList)
    $grid.remove(checkedList)
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  }
  if (checkedNum.value){
    checkedNum.value =''
    // 插入后视觉排序
    // $nextTick(() => {
    //   $gridLeft.sort('landingSequence', 'asc')
    // })
  } catch (e) {
    ElMessage.warning(e.message )
  }
}
//按编号创建流程卡
@@ -964,6 +1027,10 @@
  weight.value = parseFloat(weightsum.toFixed(2));
};
//倒序赋值
function onFlashbackChange(checked) {
  flashback.value = checked ? 0 : 1
}
</script>
<template>
@@ -1057,6 +1124,47 @@
                @checkbox-all="handleCheckboxChange"
                @checkbox-range-end="handleCheckboxChange"
            >
              <!-- 自定义 toolbar_buttons 插槽 -->
              <template #toolbar_buttons="{ $grid }">
                <!-- 手动写出所有按钮 -->
                &nbsp;
                <el-select
                    :default-first-option="true"
                    ref="getSelect" style="width: 80px"
                    v-model="optionVal"
                    class="m-2"
                >
                  <el-option
                      v-for="item in options"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                  />
                </el-select>
                &nbsp;
                <el-button
                    type="primary"
                    style="margin-right:8px;width: 50px"
                    @click="$grid.dispatchEvent('toolbar-button-click', { code: 'sorting' })"
                >
                  {{ t('processCard.sorting') }}
                </el-button>
                <el-checkbox
                    :model-value="flashback === 0"
                    @change="onFlashbackChange"
                >
                  {{ t('processCard.flashback') }}
                </el-checkbox>
              </template>
              <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
              <!--      下拉显示所有信息插槽-->
              <template #content="{ row }">
north-glass-erp/northglass-erp/src/views/pp/processCard/SelectProcessCard.vue
@@ -402,6 +402,8 @@
            let composingData = ref({
              composing: selectRecords,
              userId: user.user.userId,
              userName:user.user.userName
            })
            //修改排版状态
north-glass-erp/src/main/java/com/example/erp/controller/pp/ProcessCardController.java
@@ -103,7 +103,7 @@
    }
    //分架新增明细查询
    @ApiOperation("分架明细新增接口")
    @ApiOperation("分架新增明细查询")
    @PostMapping("/selectNoCard/{orderId}/{productionId}")
    public Result SelectNoCard(
            @PathVariable String orderId,
@@ -113,6 +113,18 @@
    }
    @ApiOperation("分架新增明细排序查询")
    @PostMapping("/selectSortingCard/{orderId}/{productionId}/{flashback}/{optionVal}")
    public Result selectSortingCard(
            @PathVariable String orderId,
            @PathVariable String productionId,
            @PathVariable String flashback,
            @PathVariable String optionVal,
            @RequestBody FlowCard flowCard) {
        return Result.seccess(flowCardService.selectSortingCardSv(orderId, productionId,flashback,optionVal, flowCard));
    }
    //添加流程卡
    @ApiOperation("流程卡创建接口")
    @SaCheckPermission("addProcessCard.add")
north-glass-erp/src/main/java/com/example/erp/mapper/pp/FlowCardMapper.java
@@ -263,4 +263,8 @@
    List<Map<String, Object>> getDetailListLikeCompound(String processId, String s, String process, String flashback, String compound, String landingSequence);
    List<Map<String, Object>> getPrintCustomDataSemiTj(String processId, String technologyNumber, String process);
    Integer getLayoutStatus(String processId);
    List<Map<String, String>> selectSortingCardMp(String orderId, String productionId, String flashback, String optionVal, FlowCard flowCard);
}
north-glass-erp/src/main/java/com/example/erp/service/pp/FlowCardService.java
@@ -526,8 +526,24 @@
        List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("composing")), FlowCard.class);
        if (!flowCardList.isEmpty()) {
            for (FlowCard flowCard : flowCardList) {
                flowCardMapper.updateComposing(flowCard.getProcessId());
                //先获取排版状态
                Integer layoutStatus = flowCardMapper.getLayoutStatus(flowCard.getProcessId());
                //2优化占用
                if (layoutStatus!=2){
                    flowCardMapper.updateComposing(flowCard.getProcessId());
                }
                else {
                    return false;
                }
            }
            //保存日志
            Log log = new Log();
            log.setContent(object.toString());
            log.setFunction("FlowCardSv流程卡排版状态");
            log.setOperatorId((String) object.get("userId"));
            log.setOperator((String) object.get("userName"));
            logService.saveLog(log);
            return true;
        } else {
            return false;
@@ -641,9 +657,16 @@
                    }
                    Map<String, Object> itemmap = new HashMap<>();
                    itemmap.put("data", flowCardMapper.getPrintCustomData(flowCard.getProcessId(), flowCard.getOrderNumber(), flowCard.getPrintQuantity()));
                    list.add(itemmap);
                    Integer sumQuantity = flowCardMapper.getSumQuantity(flowCard.getOrderId());
                    List<Map<String, Object>> details = flowCardMapper.getPrintCustomData(flowCard.getProcessId(), flowCard.getOrderNumber(), flowCard.getPrintQuantity());
                    for (Map<String, Object> detail : details) {
                        detail.put("sumQuantity", sumQuantity);
                    }
                    itemmap.put("data", details);
                    list.add(itemmap);
                    // 将该 processId 加入已处理集合
                    processedKeys.add(uniqueKey);
                }
@@ -1408,6 +1431,14 @@
        List<LocalDate> date= (List<LocalDate>) dates.get("date");
        return flowCardMapper.exportDateProcessMp(date);
    }
    public Map<String, Object> selectSortingCardSv(String orderId, String productionId, String flashback, String optionVal, FlowCard flowCard) {
        Map<String, Object> map = new HashMap<>();
        map.put("data", flowCardMapper.selectSortingCardMp(orderId, productionId,flashback,optionVal, flowCard));
        map.put("maxFlowCard", flowCardMapper.selectMaxFlowCard(orderId, productionId));
        map.put("orderOtherMoney", flowCardMapper.selectorderOtherMoney());
        return map;
    }
}
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
@@ -3483,4 +3483,65 @@
        group by fc.process_id,od.order_number, ogd.technology_number, ogd.child_width, ogd.child_height
        order by IF(fcs.sort != NULL or fcs.sort != '', fcs.sort, fc.order_number)
    </select>
    <select id="getLayoutStatus">
        select max(layout_status) from flow_card where process_id= #{processId}
    </select>
    <select id="selectSortingCardMp">
        select od.order_number,
               od.order_number       AS 'orderNumber',
                od.width,
               od.height,
               od.shape,
               od.quantity,
               od.compute_gross_area,
               p.total_thickness,
               ROUND(od.quantity-IFNULL(sum(fc.quantity)/fc.layers_number,0))           as baiscQuantity,
               od.compute_gross_area as 'computeGrossArea',
                p.total_thickness     AS 'totalThickness',
                ifnull(p.thickness,'') as thickness,
               od.weight,
               od.remarks,
               od.processing_note,
               ifnull(od.bend_radius,'') as bend_radius,
               ods.S01,
               ods.S02,
               ods.S03,
               ods.S04,
               ods.S05,
               od.building_number
        from sd.order_detail as od
                 left join sd.order_glass_detail as ogd
                           on od.order_id = ogd.order_id and od.order_number = ogd.order_number
                 left join sd.product as p on od.product_id = p.id
                 left join (SELECT order_id,
                                   order_number,
                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S01')) AS S01,
                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S02')) AS S02,
                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S03')) AS S03,
                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S04')) AS S04,
                                   JSON_UNQUOTE(JSON_EXTRACT(other_columns, '$.S05')) AS S05
                            FROM sd.order_detail
                            WHERE order_id = #{orderId}) as ods
                           on ods.order_id = od.order_id and ods.order_number = od.order_number
                 left join flow_card as fc on fc.order_id = od.order_id and fc.order_number = od.order_number
            and fc.technology_number=ogd.technology_number
        where od.order_id = #{orderId}
          and ogd.production_id = #{productionId}
          and ogd.splitting_status = 0
        GROUP BY od.order_number
        <if test="optionVal == 0 and flashback == 1">
            ORDER BY od.width ASC, od.height ASC
        </if>
        <if test="optionVal == 0 and flashback == 0">
            ORDER BY od.width DESC, od.height DESC
        </if>
        <if test="optionVal == 1 and flashback == 1">
            ORDER BY od.height ASC, od.width ASC
        </if>
        <if test="optionVal == 1 and flashback == 0">
            ORDER BY od.height DESC, od.width DESC
        </if>
    </select>
</mapper>