guoyujie
2025-07-11 08b77eaccc9e50e828e0afcf526d5cba07d3a849
装箱单打印提交
5个文件已修改
380 ■■■■■ 已修改文件
north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/decimal.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/mm/PrintPackingListLuoyang.vue
@@ -10,6 +10,7 @@
import QRCode from "qrcode";
import companyInfo from "@/stores/sd/companyInfo";
import userInfo from "@/stores/userInfo"
import {add,addAuto} from '@/utils/decimal';
//语言获取
const company = companyInfo()
const {t} = useI18n()
@@ -78,12 +79,66 @@
    //console.log(element.style.height)
  }
});
const selectPrint = () => {
const orderDetailList = ref([])
const customer = ref({})
const selectPrint =async () => {
  request.post(`/finishedGoodsInventory/getSelectPrints`, data.value).then((res) => {
    if (res.code == 200) {
      console.log(res.data.data)
      produceList.value = deepClone(res.data.data)
      console.log(produceList.value)
      customer.value = produceList.value[0].detail[0]
      let height = 0
      let index = 0
      produceList.value[0].detailList.forEach(order => {
        if(orderDetailList.value[index]===undefined){
          orderDetailList.value[index]=[]
        }
        height+=50
        //判断高度是否超过350,则换页
        if(height>=500){
          height=0
          index+=1
          orderDetailList.value[index]=[]
        }
        orderDetailList.value[index].push({
          type:'product',
          productName:order.product_name
        })
        order.detailList.forEach(item => {
          height+=30
          if(height>=500){
            height=0
            index+=1
            orderDetailList.value[index]=[]
          }
          orderDetailList.value[index].push({
            type:'size',
            size:item
          })
        })
      })
      orderDetailList.value.forEach((page,index)=>{
        let sum = {
          quantity:0,
          area:0,
          weight:0
        }
        page.forEach((row)=>{
          if(row.type==='size'){
            sum.quantity +=row.size.quantity
            sum.area =addAuto(row.size.area,sum.area,2)
            sum.weight =addAuto(row.size.weight,sum.weight,2)
          }
        })
        page.push({
          type:'sum',
          sum:sum
        })
      })
    } else {
      ElMessage.warning(res.msg)
      router.push("/login")
@@ -94,149 +149,125 @@
</script>
<template>
  <div>
    <template v-for="(item,id) in produceList"  :key="id">
      <template v-for="(items,id) in count"  :key="id">
        <div  style="width: 46%;" >
          <div  style="height: 100%;width: 100%;">
            <table>
              <thead>
              <tr>
                <td colspan="1" style="text-align: center;font-weight: bolder;">
                  <div style="width: 60px;height: 60px"><img id="img-pic" style="width:100%;height: 100%" src="@/assets/northGlass.ico" alt=""></div>
                </td>
                <td colspan="4" style="font-weight: bolder">
                  <div style="font-size: 15px;font-weight: bold;line-height: 15px;">
                    <p
                      style="font-size: 15px;
                         font-weight: bold;
                         line-height: 15px;"
                    >{{companyAddress.company}}</p>
                    <span style="font-size: 8px;">&nbsp;&nbsp;&nbsp;&nbsp;{{companyAddress.companyInfo}}</span>
                  </div>
                </td>
              </tr>
              <tr>
                <td colspan="5" style="text-align: center;">
                  <div>(装箱单)</div>
                </td>
              </tr>
              <tr style="width: 100%;font-size: 12px" v-for="(itemFlow,index) in item.detail" :key="index">
                <td colspan="5">
                  <div style="display:flex;">
                    <div style="width: 100%"><span style="font-weight: bold;">客户名称</span>:<input class="contactNumber" style="width: 60%;font-size: 12px" type="text" v-model="itemFlow.customer_name" /></div>
                  </div>
                  <div style="display:flex;">
                    <div style="width: 100%"><span style="font-weight: bold">工程名称</span>:{{itemFlow.project}}</div>
                  </div>
                  <div style="display:flex;">
                    <div style="width: 50%"><span style="font-weight: bold">订单号</span>:{{itemFlow.order_id}}</div>
                    <div style="width: 50%"><span style="font-weight: bold">装箱单号</span>:{{itemFlow.remarks}}</div>
                  </div>
                  <div style="display:flex;">
                    <div style="width: 50%"><span style="font-weight: bold">包装日期</span>:{{itemFlow.reporting_work_time}}</div>
                    <div style="width: 50%"><span style="font-weight: bold">本架数量</span>:{{itemFlow.quantity}}</div>
                  </div>
                  <div style="display:flex;">
                    <div style="width: 50%"><span style="font-weight: bold">加工班组</span>:{{itemFlow.teams_groups_name2}}</div>
                    <div style="width: 50%"><span style="font-weight: bold">包装班组</span>:{{itemFlow.teams_groups_name}}</div>
                  </div>
                  <div style="display:flex;">
                    <div style="width: 50%"><span style="font-weight: bold">质量检验</span>:<input class="contactNumber" style="font-size: 12px" type="text" v-model="name1" /></div>
                    <div style="width: 50%"><span style="font-weight: bold">成品发货</span>:<input class="contactNumber" style="font-size: 12px" type="text" v-model="name2" /></div>
                  </div>
  <div >
    <div :class="'div_'+n " style="width: 46%;position: relative;" v-for="n in 2" >
        <table v-for="page in orderDetailList" :key="page" style="width: 100%">
          <thead>
          <tr>
            <td colspan="1" style="text-align: center;font-weight: bolder;">
              <div style="width: 60px;height: 60px">
                <img id="img-pic" style="width:100%;height: 100%" src="@/assets/northGlass.ico" alt="">
              </div>
            </td>
            <td colspan="4" style="font-weight: bolder">
              <div style="font-size: 15px;font-weight: bold;line-height: 15px;">
                <p
                    style="font-size: 15px;
                             font-weight: bold;
                             line-height: 15px;"
                >{{companyAddress.company}}</p>
                <span style="font-size: 8px;">&nbsp;&nbsp;&nbsp;&nbsp;{{companyAddress.companyInfo}}</span>
              </div>
            </td>
          </tr>
          <tr>
            <td colspan="5" style="text-align: center;">
              <div>(装箱单)</div>
            </td>
          </tr>
          <tr style="width: 100%;font-size: 12px"  >
            <td colspan="5">
              <div style="display:flex;">
                <div style="width: 100%"><span style="font-weight: bold;">客户名称</span>:
                  <input class="contactNumber" style="width: 60%;font-size: 12px" type="text"
                         v-model="customer.customer_name" />
                </div>
              </div>
              <div style="display:flex;">
                <div style="width: 100%"><span style="font-weight: bold">工程名称</span>:{{customer.project}}</div>
              </div>
              <div style="display:flex;">
                <div style="width: 50%"><span style="font-weight: bold">订单号</span>:{{customer.order_id}}</div>
                <div style="width: 50%"><span style="font-weight: bold">装箱单号</span>:{{customer.remarks}}</div>
              </div>
              <div style="display:flex;">
                <div style="width: 50%"><span style="font-weight: bold">包装日期</span>:{{customer.reporting_work_time}}</div>
                <div style="width: 50%"><span style="font-weight: bold">本架数量</span>:{{customer.quantity}}</div>
              </div>
              <div style="display:flex;">
                <div style="width: 50%"><span style="font-weight: bold">加工班组</span>:{{customer.teams_groups_name}}</div>
                <div style="width: 50%"><span style="font-weight: bold">包装班组</span>:{{customer.teams_groups_name2}}</div>
              </div>
              <div style="display:flex;">
                <div style="width: 50%"><span style="font-weight: bold">质量检验</span>:刘化菊</div>
                <div style="width: 50%"><span style="font-weight: bold">成品发货</span>:</div>
              </div>
                </td>
              </tr>
              <tr style="width: 100%;font-size: 12px">
                <td style="width: 20%;">编号</td>
                <td style="width: 20%;">宽度</td>
                <td style="width: 20%;">高度</td>
                <td style="width: 20%;">片数</td>
                <td style="width: 20%;">面积(m²)</td>
              </tr>
              <tr style="width: 100%;">
                <td colspan="5" ><hr></td>
              </tr>
              </thead>
            </td>
          </tr>
          <tr style="width: 100%;font-size: 12px">
            <td style="width: 20%;">编号</td>
            <td style="width: 20%;">宽度</td>
            <td style="width: 20%;">高度</td>
            <td style="width: 20%;">片数</td>
            <td style="width: 20%;">面积(m²)</td>
          </tr>
          <tr style="width: 100%;">
            <td colspan="5" ><hr></td>
          </tr>
          </thead>
          <tbody>
          <template v-for="(row,index) in page" :key="row">
            <tr v-if="row.type==='product'" style="width: 100%;height: 100px" >
              <td colspan="1" style="font-weight: bold;font-size: 13px">加工品种:</td>
              <td colspan="4">
                <textarea style="resize: none;width: 100%;height: 100px;border: 0" class="textarea" type="textarea" v-model="row.productName" /></td>
            </tr>
            <tr v-else-if="row.type==='size'" style="width: 100%;height: 30px">
              <td style="font-size: 10px">{{ row.size.building_number }}</td>
              <td style="font-weight: bold">{{ row.size.width }}</td>
              <td style="font-weight: bold">{{ row.size.height }}</td>
              <td style="font-weight: bold">{{ row.size.quantity }}</td>
              <td>{{ row.size.area }}</td>
            </tr>
              <tbody>
              <template v-for="(itemDatile,index) in item.detailList" :key="index">
                <tr style="width: 100%;">
                  <td colspan="1" style="font-weight: bold">加工品种:</td>
                  <td colspan="4">
                    <textarea style="resize: none;width: 100%;height: 80px;border: 0" class="textarea" type="textarea"  v-model="itemDatile.product_name"/></td>
<!--                    <el-input
                        style="resize: none"
                        class="textarea"
                        type="textarea"
                        :autosize="{ minRows: 2, maxRows: 20 }"
                        v-model="itemDatile.product_name"/></td>-->
                </tr>
                <template v-for="(item,index) in itemDatile.detailList" :key="index">
                  <tr style="width: 100%;margin-top: 20px">
                    <td style="font-size: 10px">{{ item.building_number }}</td>
                    <td style="font-weight: bold">{{ item.width }}</td>
                    <td style="font-weight: bold">{{ item.height }}</td>
                    <td style="font-weight: bold">{{ item.quantity }}</td>
                    <td>{{ item.area }}</td>
                  </tr>
                </template>
              </template>
            <tr id="footsum" v-else style="border: 0;font-size: 10px">
              <td colspan="5" style="border: 0;">
                <div style="display:flex;">
                  <div>本架数量</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>{{row.sum.quantity}}</div>&nbsp;&nbsp;&nbsp;
                  <div>面积</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>{{row.sum.area}}(m²)</div>&nbsp;&nbsp;&nbsp;
                  <div>重量</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>{{row.sum.weight}}(kg)</div>
                </div>
              </td>
            </tr>
          </template>
          </tbody>
          <tfoot id="sticky-footer">
            <tr style="border: 0;font-size: 8px">
              <td colspan="5" style="border: 0;">
                <div style="display:flex;">
                  <div>地址:{{companyAddress.address}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>电话:{{companyAddress.phone}}</div>
                </div>
                <div style="display:flex;">
                  <div>{{companyAddress.url}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>传真:{{companyAddress.fax}}</div>
                </div>
                <div style="display:flex;">
                  <div>E-mail:{{companyAddress.email}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                  <div>邮编:{{companyAddress.postcode}}</div>
                </div>
              <!--        <tr style="width: 100%;" v-for="(itemFlows,index) in item.detail" :key="index">
                        <td>合计</td>
                        <td></td>
                        <td></td>
                        <td>{{itemFlows.quantity}}</td>
                        <td>{{itemFlows.area}}</td>
                      </tr>-->
              </tbody>
              <tfoot >
              <tr style="border: 0;font-size: 10px">
                <td colspan="5" style="border: 0;">
                  <div style="display:flex;">
                    <div>本架数量</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>{{item.detail[0].quantity}}</div>&nbsp;&nbsp;&nbsp;
                    <div>面积</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>{{item.detail[0].area}}(m²)</div>&nbsp;&nbsp;&nbsp;
                    <div>重量</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>{{item.detail[0].weight}}(kg)</div>
                  </div>
                </td>
              </tr>
              <tr style="border: 0;font-size: 8px">
                <td colspan="5" style="border: 0;">
                  <div style="display:flex;">
                    <div>地址:{{companyAddress.address}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>电话:{{companyAddress.phone}}</div>
                  </div>
                  <div style="display:flex;">
                    <div>{{companyAddress.url}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>传真:{{companyAddress.fax}}</div>
                  </div>
                  <div style="display:flex;">
                    <div>E-mail:{{companyAddress.email}}</div>&nbsp;&nbsp;&nbsp;&nbsp;
                    <div>邮编:{{companyAddress.postcode}}</div>
                  </div>
                </td>
              </tr>
              </tfoot>
            </table>
          </div>
        </div>
        <div class="element-to-break-after" v-if="items.id===1" ></div>
        <div class="element-to-breakr" v-if="items.id===2" ></div>
      </template>
    </template>
              </td>
            </tr>
          </tfoot>
        </table>
      </div>
  </div>
</template>
@@ -246,7 +277,16 @@
  margin: 0;
  padding: 0;
}
.contactNumber{
  width: 40%;
  height:20px;
  border: none;
  box-shadow: none;
  font-size: 15px;
}
.div_2{
  margin-left: 6%;
}
.element-to-break-after {
  width: 8%;
}
@@ -267,6 +307,7 @@
table{
  width: 100%;
  page-break-after: always;
}
@media print {
@@ -275,12 +316,17 @@
    margin: 4mm 5mm 0mm 5mm  /* this affects the margin in the printer settings */
  }
  input {
    display: inline; /* 或者根据需要使用其他合适的显示方式 */
    visibility: visible;
  #footsum{
    position: fixed;
    bottom: 2cm;
    width: 100%; /* 或者设置成具体的宽度 */
  }
    thead{
  #sticky-footer {
    position: fixed;
    bottom: 1cm;
    width: 100%; /* 或者设置成具体的宽度 */
  }
/*    thead{
    display: table-header-group;
    page-break-inside: avoid;
  }
@@ -295,21 +341,11 @@
  tfoot {
    display: table-footer-group;
    page-break-inside: avoid;
    /* position: fixed;
     width: 50%;
     bottom: 0;
     height: 100px;*/
  }
  }*/
}
.contactNumber{
  width: 40%;
  height:20px;
  border: none;
  box-shadow: none;
  font-size: 15px;
}
.textarea{
  --el-border-color: rgba(255,255,255,0.0);
north-glass-erp/northglass-erp/src/utils/decimal.js
@@ -7,6 +7,11 @@
    const decimal2 = new Decimal(num2===null?0:num2);
    return decimal1.plus(decimal2).toString();
}
function addAuto(num1, num2,scale) {
    const decimal1 = new Decimal(num1===null?0:num1);
    const decimal2 = new Decimal(num2===null?0:num2);
    return decimal1.plus(decimal2).toFixed(2)
}
// 封装减法函数
function subtract(num1, num2) {
@@ -44,6 +49,7 @@
    multiply,
    divide,
    multiplyAuto,
    divideAuto
    divideAuto,
    addAuto
}
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java
@@ -98,7 +98,7 @@
    List<Map<String, Object>> getDetailList(String orderId, String processId, String remarks);
    List<Map<String, Object>> getDetailLists(String orderId, String remarks, Integer productId);
    List<Map<String, Object>> getDetailLists(String orderId, String remarks, Integer productId,String thickness);
    List<Map<String, Object>> getDetailList2(String orderId, String processId, String remarks);
}
north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java
@@ -863,7 +863,13 @@
                for(Map<String, Object> details:detailList){
                    Map<String, Object> detailsmap = new HashMap<>();
                    detailsmap.put("product_name",details.get("product_name").toString());
                    detailsmap.put("detailList",finishedOperateLogMapper.getDetailLists(finishedOperateLog.getOrderId(),finishedOperateLog.getRemarks(), Integer.valueOf(details.get("product_id").toString())));
                    detailsmap.put("detailList",finishedOperateLogMapper
                            .getDetailLists(
                                    finishedOperateLog.getOrderId(),
                                    finishedOperateLog.getRemarks(),
                                    Integer.valueOf(details.get("product_id").toString()),
                                    details.get("thickness").toString()
                            ));
                    detailsmaplist.add(detailsmap);
                }
north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml
@@ -932,7 +932,8 @@
            fol.quantity,
            od.product_name,
            od.product_id,
            ROUND( od.width * od.height * fol.quantity / 1000000, 2 ) as area
            ROUND( od.width * od.height * fol.quantity / 1000000, 2 ) as area,
            ROUND( od.width * od.height * fol.quantity / 1000000, 2 )*#{thickness}*2.5 as weight
        FROM
            ( SELECT * FROM mm.finished_operate_log aa WHERE aa.operate_type = '入库' AND aa.STATUS != '已作废' ) fol
                LEFT JOIN sd.order_detail od ON fol.order_id = od.order_id
@@ -948,11 +949,14 @@
    <select id="getDetailList2">
        SELECT
            od.product_id,
            od.product_name
            od.product_name,
            pro.thickness
        FROM
            ( SELECT * FROM mm.finished_operate_log aa WHERE aa.operate_type = '入库' AND aa.STATUS != '已作废' ) fol
                LEFT JOIN sd.order_detail od ON fol.order_id = od.order_id
                AND fol.operation_number = od.order_number
                left join sd.product as pro
                on pro.id = od.product_id
                LEFT JOIN sd.`order` o ON o.order_id = fol.order_id
        WHERE
            o.order_id=#{orderId} and fol.remarks=#{remarks}