From 79b057e22e97e7db70faf25b33a5977b06771810 Mon Sep 17 00:00:00 2001
From: 廖井涛 <2265517004@qq.com>
Date: 星期一, 08 十二月 2025 14:52:54 +0800
Subject: [PATCH] 打印加工单修改,新增用户登录日志

---
 north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue |  372 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 372 insertions(+), 0 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue
new file mode 100644
index 0000000..6100c64
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue
@@ -0,0 +1,372 @@
+<script setup>
+/*鐢熶骇鍔犲伐鍗曠珫鐗�*/
+import request from "@/utils/request"
+import {computed, onMounted, ref} from "vue"
+import PrintFoot from "@/components/sd/order/PrintFoot.vue"
+import companyInfo from "@/stores/sd/companyInfo"
+import deepClone from "@/utils/deepClone";
+import {ElMessage} from "element-plus";
+import useUserInfoStore from "@/stores/userInfo";
+import {Bottom, Burger, Food} from "@element-plus/icons-vue";
+const company = companyInfo()
+const userStore = useUserInfoStore()
+const username = userStore.user.userName
+let dialogVisible = ref(false)
+
+
+let props = defineProps({
+  orderId:null,
+})
+let productId=ref({
+
+})
+let data = ref({
+  order:{
+    processingNote:''
+  },
+  orderProductDetail:[]
+})
+let productIdData = ref({
+})
+const selectedValues = ref([])
+
+const grossNum = ref({
+  quantity: 0,
+  grossArea: 0,
+  perimeter: 0,
+  weight:0
+})
+const getData = () => {
+  request.get(`/order/printOrderProductDetail/${props.orderId}/${selectedValues.value}`).then(res => {
+    data.value= res.data
+    productIdData.value=data.value.orderProductDetail
+    data.value.orderProductDetail.forEach(item => {
+      grossNum.value.quantity += getQuantity(item.productDetail)
+      grossNum.value.grossArea += getArea(item.productDetail)
+      grossNum.value.perimeter += getPerimeter(item.productDetail)
+      grossNum.value.weight += getWeight(item.productDetail)
+      stringToJson(item.productDetail)
+    })
+
+    grossNum.value.quantity = parseFloat(grossNum.value.quantity.toFixed(2))
+    grossNum.value.grossArea = parseFloat(grossNum.value.grossArea.toFixed(2))
+    grossNum.value.perimeter = parseFloat(grossNum.value.perimeter.toFixed(3))
+    grossNum.value.weight = parseFloat(grossNum.value.weight.toFixed(2))
+
+  })
+}
+
+const handleChange = () => {
+
+  request.get(`/order/printOrderProductDetail/${props.orderId}/${selectedValues.value}`).then(res => {
+    grossNum.value.quantity=0
+    grossNum.value.grossArea=0
+    grossNum.value.perimeter=0
+    grossNum.value.weight=0
+    data.value= res.data
+
+    data.value.orderProductDetail.forEach(item => {
+      grossNum.value.quantity += getQuantity(item.productDetail)
+      grossNum.value.grossArea += getArea(item.productDetail)
+      grossNum.value.perimeter += getPerimeter(item.productDetail)
+      grossNum.value.weight += getWeight(item.productDetail)
+      stringToJson(item.productDetail)
+    })
+    grossNum.value.quantity = parseFloat(grossNum.value.quantity.toFixed(2))
+    grossNum.value.grossArea = parseFloat(grossNum.value.grossArea.toFixed(2))
+    grossNum.value.perimeter = parseFloat(grossNum.value.perimeter.toFixed(3))
+    grossNum.value.weight = parseFloat(grossNum.value.weight.toFixed(2))
+
+  })
+
+}
+
+const handleDoubleClick = () => {
+  dialogVisible.value=true
+}
+
+onMounted(() => {
+  getData()
+})
+
+const  stringToJson = (productList) => {
+  productList.forEach(item => {
+    item.otherColumns = JSON.parse(item.otherColumns)
+  })
+}
+
+const getQuantity = (productList) => {
+  let quantity = 0
+  productList.forEach(item => {
+    quantity += item.quantity
+  })
+  return parseFloat(quantity.toFixed(2))
+
+}
+
+const getArea = (productList) => {
+  let area = 0
+  productList.forEach(item => {
+    area += item.grossArea
+  })
+  return parseFloat(area.toFixed(2))
+
+}
+
+const getPerimeter = (productList) => {
+  let perimeter = 0
+  productList.forEach(item => {
+    perimeter += item.perimeter
+  })
+  return parseFloat(perimeter.toFixed(3))
+}
+
+const getWeight = (productList) => {
+  let weight = 0
+  productList.forEach(item => {
+    weight += item.weight*item.quantity
+  })
+  return parseFloat(weight.toFixed(2))
+}
+
+
+const printSheet = () => {
+}
+
+
+
+
+defineExpose({
+  printSheet
+});
+</script>
+
+
+<template>
+
+  <div id="sheet" @dblclick="handleDoubleClick" >
+    <table style="border-style: none;" >
+      <thead>
+      <tr class="title-s">
+        <th colspan="9">
+          <h1>
+            {{ company.companyName }}
+          </h1>
+        </th>
+      </tr>
+
+      <tr class="title-s">
+        <th colspan="2" style="width: 30%;text-align: left;"><span>鎬婚噸閲�:{{ grossNum.weight }}</span></th>
+        <th colspan="5" style="width: 40%;">
+          <h3 >鐢熶骇浠诲姟鍗�({{data.order.orderType}})</h3>
+        </th>
+        <th colspan="2" style="width: 30%;">璁㈠崟缂栧彿锛�<span>{{ data.order.orderId }}</span>
+          <span v-if="company.companyName==='甯稿窞甯傚悏鍒╃幓鐠冩湁闄愬叕鍙�'&& data.order.batch!==''">(鍘焮{ data.order.batch }})</span>
+        </th>
+      </tr>
+      <tr>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" colspan="4">
+          瀹㈡埛鍚嶇О锛�<span>{{ data.order.customerName }}</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" v-if="data.order.batch!==''" colspan="3">
+          椤圭洰鍚嶇О锛�<span>{{ data.order.project }}({{data.order.batch}})</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" v-else colspan="3">
+          椤圭洰鍚嶇О锛�<span>{{ data.order.project }}</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" colspan="2">
+          鍙戣揣鏃ユ湡锛�<span>{{ data.order.deliveryDate }}</span></th>
+      </tr>
+      <tr>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" colspan="7">
+          閫佽揣鍦板潃锛�<span>{{ data.order.deliveryAddress }}</span></th>
+        <th style="text-align: left;border:none;font-weight: bold;font-size: 17px;" colspan="2">
+          鑱旂郴鐢佃瘽锛�<span><input class="contactNumber" type="text" v-model="data.order.contactNumber"/></span></th>
+      </tr>
+
+      </thead>
+      <tr style="border-style: none">
+        <td colspan="9" style="border-style: none">
+          <table style="border-style: none;width: 100%;height: 100%">
+            <template v-for="(item, index) in data.orderProductDetail" :key="index" >
+              <thead>
+              <tr v-if="index===0">
+                <th style="width: 6%;font-weight: bold;">搴�</th>
+                <th style="width: 15%;font-weight: bold;" >妤煎眰缂栧彿</th>
+                <th style="width: 20%;font-weight: bold;" colspan="3">瀹絏楂�</th>
+                <th style="width: 8%;font-weight: bold;">鏁伴噺</th>
+                <th style="width: 8%;font-weight: bold;">鍛ㄩ暱</th>
+                <th style="width: 12%;font-weight: bold;">闈㈢Н</th>
+                <th style="width: 22%;font-weight: bold;" colspan="2">鍔犲伐瑕佹眰/澶囨敞</th>
+              </tr>
+
+
+              </thead>
+              <tr style="border-style: none">
+                <td style="font-size: 15px;font-weight: bold;text-align: left" colspan="9">
+                  浜у搧鍚嶇О:<span>{{item.productName}}</span>
+                </td>
+              </tr>
+
+              <tr class="day-in" v-for="(items, index1) in item.productDetail" :key="index1">
+                <td>{{items.orderNumber}}</td>
+                <td>{{items.buildingNumber}}</td>
+                <td colspan="3" style="font-size: 20px;font-weight: bold;" v-if="items.otherColumns?.S02&&company.companyName!='涓婃捣鍖楃幓鐜荤拑鎶�鏈伐涓氭湁闄愬叕鍙�'">{{items.otherColumns?.S02}}</td>
+                <td colspan="3" style="font-size: 17px;white-space:nowrap;font-weight: bold;" v-else-if="items.differentSize===1 && items.bendRadius==null">
+                  <template v-for="(orderGlassDetail, index1) in items.orderGlassDetails" >
+                   ({{orderGlassDetail.childWidth}}x{{orderGlassDetail.childHeight}})
+                  </template>
+                </td>
+                <td colspan="3" style="font-size: 20px;font-weight: bold;" v-else>{{items.width}}x{{items.height}}</td>
+                <td style="font-size: 20px;font-weight: bold;">{{items.quantity}}</td>
+                <td style="font-size: 20px;font-weight: bold;">{{items.perimeter}}</td>
+                <td style="font-size: 20px;font-weight: bold;">{{items.grossArea.toFixed(2)}}</td>
+                <td colspan="2">{{items.processingNote}}
+                  {{items.remarks==null?'':'/'}}
+                  {{items.remarks}}</td>
+              </tr>
+              <tr class="day-in" >
+                <td style="font-size: 15px;font-weight: bold;" colspan="5">灏忚:</td>
+                <td style="font-size: 20px;font-weight: bold;">{{getQuantity(item.productDetail)}}</td>
+                <td style="font-size: 20px;font-weight: bold;">{{getPerimeter(item.productDetail)}}</td>
+                <td style="font-size: 20px;font-weight: bold;">{{getArea(item.productDetail)}}</td>
+                <td colspan="2"></td>
+              </tr>
+
+            </template>
+            <tr class="day-in">
+              <td style="font-size: 15px;font-weight: bold;" colspan="5">鍚堣:</td>
+              <td style="font-size: 20px;font-weight: bold;">{{grossNum.quantity}}</td>
+              <td style="font-size: 20px;font-weight: bold;">{{grossNum.perimeter}}</td>
+              <td style="font-size: 20px;font-weight: bold;">{{grossNum.grossArea}}</td>
+              <td colspan="2"></td>
+            </tr>
+            <tr class="day-in">
+              <td style="text-align: left;border-width: 0 0 0 0; border-style: solid; border-color: #d3dce6" colspan="9">
+                <template v-for="(item,index) in data.order.processingNote.split('\n')">
+                  {{item}}
+                  <br>
+                </template>
+              </td>
+            </tr>
+
+            <tfoot style="border: 0">
+            <!--      <el-row :gutter="24">
+                    <el-col :span="4"><div style="font-size: 12px" class="bottom">鍒跺崟鍛橈細{{data.order.creator}}<span style="font-size: 10px"></span></div></el-col>
+                    <el-col :span="6"><div style="font-size: 12px" class="bottom">鍒跺崟鏃ユ湡锛歿{data.order.createTime}}<span style="font-size: 10px"></span></div></el-col>
+                    <el-col :span="4"><div style="font-size: 12px" class="bottom">瀹℃牳鍛橈細{{data.order.verifier}}</div></el-col>
+                    <el-col :span="6"><div style="font-size: 12px" class="bottom">瀹℃牳鏃ユ湡锛歿{data.order.updateTime}}</div></el-col>
+                    <el-col :span="4"><div style="font-size: 12px" class="bottom">鎵撳嵃浜猴細{{username}}</div></el-col>
+
+                  </el-row>-->
+            <tr class="day-in" style="border: 0;">
+              <td colspan="9" style="border: 0;">
+                <div style="display:flex;">
+                  <div style="width: 15%">鍒跺崟鍛橈細{{ data.order.creator }}</div>
+                  <div style="width: 25%">鍒跺崟鏃ユ湡锛歿{ data.order.createTime }}</div>
+                  <div style="width: 15%">瀹℃牳鍛橈細{{ data.order.verifier }}</div>
+                  <div style="width: 25%">瀹℃牳鏃ユ湡锛歿{ data.order.updateTime }}</div>
+                  <div style="width: 15%">鎵撳嵃浜猴細{{ username }}</div>
+                </div>
+
+
+              </td>
+            </tr>
+            </tfoot>
+          </table>
+        </td>
+      </tr>
+
+
+
+
+
+
+    </table>
+
+    <el-dialog v-model="dialogVisible" style="width: 40%;height: 20%;margin-top: 10%" >
+      <el-select v-model="selectedValues" style="width: 100%" @change="handleChange" multiple  placeholder="璇烽�夋嫨">
+        <el-option
+            v-for="item in productIdData"
+            :key="item"
+            :label='item.productId+"   "+item.productName'
+            :value="item.productId">
+        </el-option>
+      </el-select>
+    </el-dialog>
+
+  </div>
+
+
+</template>
+
+<style scoped>
+h1,h3{
+  left:0;
+  right:0;
+  top:0;
+  bottom:0;
+  margin:auto;
+}
+h1{
+  font-size: 1.5rem;
+}
+h3{
+  font-size: 1.2rem;
+  font-weight: bolder;
+}
+
+
+table{
+  border-collapse: collapse;
+  width: 100%;
+  text-align: center;
+}
+tr,td,th{
+  border: 1px solid black;
+}
+
+th,.no-change-row {
+  white-space: nowrap;
+}
+
+.title-1{
+  width: 76px;
+}
+.title-s,.title-s th{
+  border:0
+}
+
+.hr-border{
+  height: 2px;
+  width: 100%;
+  background-color: black;
+  color: black;
+}
+table {
+  border-collapse: collapse;
+  width: 100%;
+
+}
+td > table {
+  margin: 0;
+  padding: 0;
+}
+.day-in{
+  height: 30px;
+}
+.contactNumber{
+  width: 125px;
+  height:20px;
+  border: none;
+  box-shadow: none;
+  font-size: 17px;
+}
+
+@media print {
+  @page {
+    margin: 5mm 5mm 10mm 5mm;
+  }
+}
+
+
+
+
+</style>
\ No newline at end of file

--
Gitblit v1.8.0