You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3303 lines
112 KiB

1 year ago
1 year ago
5 months ago
1 year ago
11 months ago
1 year ago
1 year ago
5 months ago
1 year ago
1 year ago
1 year ago
1 year ago
5 months ago
1 year ago
5 months ago
1 year ago
1 year ago
11 months ago
6 months ago
6 months ago
11 months ago
1 year ago
6 months ago
1 year ago
11 months ago
11 months ago
1 year ago
11 months ago
1 year ago
11 months ago
6 months ago
1 year ago
3 months ago
1 year ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
6 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 months ago
6 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
12 months ago
1 year ago
12 months ago
1 year ago
1 year ago
3 months ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
11 months ago
11 months ago
5 months ago
1 year ago
11 months ago
5 months ago
1 year ago
3 months ago
1 year ago
12 months ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
5 months ago
1 year ago
6 months ago
1 year ago
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
3 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
6 months ago
1 year ago
6 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
6 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
6 months ago
3 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
3 months ago
1 year ago
11 months ago
1 year ago
3 months ago
1 year ago
1 year ago
1 year ago
6 months ago
1 year ago
5 months ago
5 months ago
5 months ago
5 months ago
11 months ago
11 months ago
11 months ago
12 months ago
1 year ago
1 year ago
1 year ago
3 months ago
5 months ago
5 months ago
1 year ago
5 months ago
3 months ago
5 months ago
5 months ago
5 months ago
1 year ago
1 year ago
5 months ago
5 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
11 months ago
1 year ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
1 year ago
5 months ago
5 months ago
5 months ago
5 months ago
1 year ago
1 year ago
11 months ago
1 year ago
5 months ago
1 year ago
6 months ago
1 year ago
11 months ago
1 year ago
6 months ago
6 months ago
6 months ago
1 year ago
6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
6 months ago
6 months ago
6 months ago
1 year ago
6 months ago
1 year ago
6 months ago
1 year ago
6 months ago
1 year ago
6 months ago
1 year ago
6 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
11 months ago
11 months ago
8 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
6 months ago
3 months ago
6 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
1 year ago
10 months ago
1 year ago
5 months ago
1 year ago
5 months ago
11 months ago
6 months ago
1 year ago
  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" label-position="top" label-width="100px" style="margin-top: 0px;">
  4. <el-form-item :label="'BU:'">
  5. <el-select v-model="searchData.buNo" placeholder="请选择" >
  6. <el-option label="全部" value=""></el-option>
  7. <el-option
  8. v-for = "i in buList"
  9. :key = "i.buNo"
  10. :label = "i.buDesc"
  11. :value = "i.buNo">
  12. </el-option>
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item :label="'发货通知单:'">
  16. <el-input v-model="searchData.delNo" style="width: 120px"></el-input>
  17. </el-form-item>
  18. <el-form-item :label="'CMC Invoice:'">
  19. <el-input v-model="searchData.cmcInvoice" style="width: 120px"></el-input>
  20. </el-form-item>
  21. <el-form-item :label="'通知单状态:'">
  22. <el-select filterable v-model="searchData.notifyStatus" style="width: 120px">
  23. <el-option label="全部" value=""></el-option>
  24. <el-option label="已下达" value="已下达"></el-option>
  25. <el-option label="仓库已确认" value="仓库已确认"></el-option>
  26. <el-option label="已报关" value="已报关"></el-option>
  27. <el-option label="订单取消" value="订单取消"></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item :label="'ReadyDate'" >
  31. <el-date-picker
  32. style="width: 120px"
  33. v-model="searchData.startDate"
  34. type="date"
  35. format="yyyy-MM-dd"
  36. value-format="yyyy-MM-dd"
  37. placeholder="选择日期">
  38. </el-date-picker>
  39. </el-form-item>
  40. <el-form-item :label="'To'" >
  41. <el-date-picker
  42. style="width: 120px"
  43. v-model="searchData.endDate"
  44. type="date"
  45. format="yyyy-MM-dd"
  46. value-format="yyyy-MM-dd"
  47. placeholder="选择日期">
  48. </el-date-picker>
  49. </el-form-item>
  50. <el-form-item :label="'是否导出:'">
  51. <el-select v-model="searchData.exportFlag" style="width: 120px">
  52. <el-option label="全部" value=""></el-option>
  53. <el-option label="已导出" value="Y"></el-option>
  54. <el-option label="未导出" value="N"></el-option>
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item label="改单">
  58. <el-checkbox v-model="searchData.modifyData" true-label="true" false-label="false" @change="searchTable()"></el-checkbox>
  59. </el-form-item>
  60. <el-form-item :label="' '" >
  61. <el-button @click="searchTable()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'查询'}}</el-button>
  62. </el-form-item>
  63. </el-form>
  64. <el-table
  65. @row-click="changeData"
  66. highlight-current-row
  67. :height="height"
  68. :data="dataList"
  69. ref="mainTable"
  70. border :cell-style="cellStyle"
  71. :row-class-name="tableRowClassName"
  72. v-loading="dataListLoading"
  73. style="width: 100%;">
  74. <el-table-column
  75. header-align="center"
  76. align="center"
  77. width="100"
  78. fixed="left"
  79. label="操作">
  80. <template slot-scope="scope">
  81. <a type="text" size="small" v-if="scope.row.notifyStatus==='已报关'" @click="updateModelOpen(scope.row)">修改</a>
  82. <a type="text" size="small" v-if="scope.row.notifyStatus==='已下达'" @click="confirmModelOpen(scope.row)">仓库确认</a>
  83. <a type="text" size="small" v-if="scope.row.notifyStatus==='仓库已确认'" @click="cancerConfirm(scope.row)">取消确认</a>
  84. </template>
  85. </el-table-column>
  86. <el-table-column
  87. v-for="(item,index) in columnList1" :key="index"
  88. :sortable="item.columnSortable"
  89. :prop="item.columnProp"
  90. :header-align="item.headerAlign"
  91. :show-overflow-tooltip="item.showOverflowTooltip"
  92. :align="item.align"
  93. :fixed="item.fixed==''?false:item.fixed"
  94. :min-width="item.columnWidth"
  95. :label="item.columnLabel">
  96. <template slot-scope="scope">
  97. <span v-if="!item.columnHidden"> {{scope.row[item.columnProp]}}</span>
  98. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  99. style="width: 100px; height: 80px"/></span>
  100. </template>
  101. </el-table-column>
  102. </el-table>
  103. <el-pagination
  104. @size-change="sizeChangeHandle"
  105. @current-change="currentChangeHandle"
  106. :current-page="pageIndex"
  107. :page-sizes="[20, 50, 100, 1000]"
  108. :page-size="pageSize"
  109. :total="totalPage"
  110. layout="total, sizes, prev, pager, next, jumper">
  111. </el-pagination>
  112. <el-tabs style="font-size: 12px;min-height: 200px" class="customer-tab" v-model="activeName" type="border-card" @tab-click="tabClick" >
  113. <el-tab-pane :label="currentRow.cmcInvoice+'明细'" name="detail">
  114. <el-table
  115. :height="height" ref="cloDetailTable"
  116. :data="dataList2" show-summary :summary-method="getDetailSummaries"
  117. border :cell-style="cellStyleDetail"
  118. style="width: 100%;">
  119. <el-table-column
  120. v-for="(item,index) in columnList2" :key="index"
  121. :sortable="item.columnSortable"
  122. :prop="item.columnProp"
  123. :header-align="item.headerAlign"
  124. :show-overflow-tooltip="item.showOverflowTooltip"
  125. :align="item.align"
  126. :fixed="item.fixed==''?false:item.fixed"
  127. :min-width="item.columnWidth"
  128. :label="item.columnLabel">
  129. <template slot-scope="scope">
  130. <!-- 金额字段特殊处理 -->
  131. <span v-if="item.columnProp === 'ttlAmount' || item.columnProp === 'sumPrice'">
  132. {{!!scope.row[item.columnProp]?scope.row[item.columnProp].toFixed(2):''}}
  133. </span>
  134. <!-- PN字段特殊处理添加提示信息 -->
  135. <template v-else-if="item.columnProp === 'pn'">
  136. <el-tooltip
  137. v-if="isPnDataIncomplete(scope.row)"
  138. :content="getPnIncompleteTooltip(scope.row)"
  139. placement="top">
  140. <span
  141. v-if="!item.columnHidden"
  142. class="clickable-pn"
  143. @click="navigateToPartHsCode(scope.row.pn)">
  144. {{ scope.row[item.columnProp] }}
  145. </span>
  146. </el-tooltip>
  147. <span v-else-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  148. </template>
  149. <!-- 其他字段正常处理 -->
  150. <template v-else>
  151. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  152. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  153. </template>
  154. </template>
  155. </el-table-column>
  156. </el-table>
  157. </el-tab-pane>
  158. <el-tab-pane label="手工装箱" name="box">
  159. <el-button @click="oneClickPacking()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'一键装箱'}}</el-button>
  160. <el-button @click="upLoadPallet()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'导入装箱单'}}</el-button>
  161. <el-button @click="newPalletModel()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'装箱'}}</el-button>
  162. <el-button @click="palletMaintenance()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'栈板维护'}}</el-button>
  163. <el-button @click="exportExcel()" type="primary" style="margin-left: 2px;margin-top: 0px">{{'导出模版'}}</el-button>
  164. <el-table ref="detailTable"
  165. :data="dataList4"
  166. :height="height"
  167. border show-summary :summary-method="getSummaries"
  168. v-loading="dataListLoading"
  169. style="width: 100%; ">
  170. <el-table-column
  171. header-align="center"
  172. align="center"
  173. width="150"
  174. fixed="left"
  175. label="操作">
  176. <template slot-scope="scope">
  177. <a type="text" size="small" @click="updatePalletModel(scope.row)">修改</a>
  178. <a type="text" size="small" @click="deletePallet(scope.row)">删除</a>
  179. </template>
  180. </el-table-column>
  181. <el-table-column
  182. v-for="(item,index) in columnList4" :key="index"
  183. :sortable="item.columnSortable"
  184. :prop="item.columnProp"
  185. :header-align="item.headerAlign"
  186. :show-overflow-tooltip="item.showOverflowTooltip"
  187. :align="item.align"
  188. :fixed="item.fixed==''?false:item.fixed"
  189. :min-width="item.columnWidth"
  190. :label="item.columnLabel">
  191. <template slot-scope="scope">
  192. <span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
  193. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  194. style="width: 100px; height: 80px"/></span>
  195. </template>
  196. </el-table-column>
  197. </el-table>
  198. </el-tab-pane>
  199. <el-tab-pane label="装箱明细" name="pallet">
  200. <packing-detail-tab
  201. ref="packingDetailTab"
  202. :current-row="currentRow"
  203. :height="height"
  204. :show-actions="true">
  205. </packing-detail-tab>
  206. </el-tab-pane>
  207. <el-tab-pane label="相关文档" name="codelnotifyConfirmDocument">
  208. <oss-components label="申请单号" style="margin-top: 5px" height="44vh" :columns="ossColumns"
  209. :order-ref1="currentRow.site" :order-ref2="currentRow.delNo" :codelnotifyFlag="'2'"
  210. :rfq-no="currentRow.delNo">
  211. </oss-components>
  212. </el-tab-pane>
  213. </el-tabs>
  214. <el-dialog title="仓库确认" :close-on-click-modal="false" v-drag :visible.sync="confirmModelFlag" width="400px">
  215. <el-form label-position="top" style="margin-left: 7px;margin-top: -5px;">
  216. <el-row :gutter="20">
  217. <el-col :span="12">
  218. <el-form-item :label="'CMC Invoice'" >
  219. <el-input v-model="confirmModel.cmcInvoice" disabled ></el-input>
  220. </el-form-item>
  221. </el-col>
  222. <el-col :span="12">
  223. <el-form-item :label="'ReadyDate'" >
  224. <el-input v-model="confirmModel.readyDate" disabled ></el-input>
  225. </el-form-item>
  226. </el-col>
  227. <el-col :span="12">
  228. <el-form-item :label="'预计发货日期'" >
  229. <el-date-picker
  230. style="width: 100%"
  231. v-model="confirmModel.notifyDate"
  232. type="date"
  233. format="yyyy-MM-dd"
  234. value-format="yyyy-MM-dd"
  235. placeholder="选择日期">
  236. </el-date-picker>
  237. </el-form-item>
  238. </el-col>
  239. </el-row>
  240. </el-form>
  241. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  242. <el-button type="primary" @click="confirmDo()">保存</el-button>
  243. <el-button type="primary" @click="confirmModelFlag=false">关闭</el-button>
  244. </el-footer>
  245. </el-dialog>
  246. <el-dialog title="修改" :close-on-click-modal="false" v-drag :visible.sync="updateModelFlag" width="350px">
  247. <el-form label-position="top" style="margin-left: 7px;margin-top: -5px;">
  248. <el-row :gutter="20">
  249. <el-col :span="12">
  250. <el-form-item :label="'ReadyDate'" >
  251. <el-date-picker
  252. style="width: 100%"
  253. v-model="confirmModel.readyDate"
  254. type="date"
  255. format="yyyy-MM-dd"
  256. value-format="yyyy-MM-dd"
  257. placeholder="选择日期">
  258. </el-date-picker>
  259. </el-form-item>
  260. </el-col>
  261. <el-col :span="12">
  262. <el-form-item :label="'预计发货日期'" >
  263. <el-date-picker
  264. style="width: 100%"
  265. v-model="confirmModel.notifyDate"
  266. type="date"
  267. format="yyyy-MM-dd"
  268. value-format="yyyy-MM-dd"
  269. placeholder="选择日期">
  270. </el-date-picker>
  271. </el-form-item>
  272. </el-col>
  273. </el-row>
  274. </el-form>
  275. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  276. <el-button type="primary" @click="updateDo()">保存</el-button>
  277. <el-button type="primary" @click="updateModelFlag=false">关闭</el-button>
  278. </el-footer>
  279. </el-dialog>
  280. <el-dialog title="维护箱" :close-on-click-modal="false" v-drag :visible.sync="boxModelFlag" width="500px">
  281. <el-form label-position="top" style="margin-left: 7px;margin-top: -5px;">
  282. <el-row :gutter="20">
  283. <el-col :span="12">
  284. <el-form-item :label="boxModelData.type===1?'物料编码':''">
  285. <span v-if="boxModelData.type===0" slot="label" @click="openPartDialog()"><a herf="#">物料编码</a></span>
  286. <el-input v-model="boxModelData.pn" :disabled="boxModelData.type===1" ></el-input>
  287. </el-form-item>
  288. </el-col>
  289. <el-col :span="12">
  290. <el-form-item :label="'数量'" >
  291. <el-input v-model="boxModelData.qty" type="number" ></el-input>
  292. </el-form-item>
  293. </el-col>
  294. <el-col :span="12" v-if="boxModelData.type===0">
  295. <el-form-item :label="'PO'" >
  296. <el-input v-model="boxModelData.poNo" ></el-input>
  297. </el-form-item>
  298. </el-col>
  299. <el-col :span="12">
  300. <el-form-item :label="'箱数'" >
  301. <el-input v-model="boxModelData.boxQty"></el-input>
  302. </el-form-item>
  303. </el-col>
  304. <el-col :span="12">
  305. <el-form-item :label="'ROLLS'" >
  306. <el-input v-model="boxModelData.rolls" ></el-input>
  307. </el-form-item>
  308. </el-col>
  309. <el-col :span="12">
  310. <el-form-item :label="'毛重'" >
  311. <el-input v-model="boxModelData.grossWeight"></el-input>
  312. </el-form-item>
  313. </el-col>
  314. <el-col :span="12">
  315. <el-form-item :label="'净重'" >
  316. <el-input v-model="boxModelData.netWeight" ></el-input>
  317. </el-form-item>
  318. </el-col>
  319. </el-row>
  320. </el-form>
  321. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  322. <el-button type="primary" @click="saveBoxHeader()">保存</el-button>
  323. <el-button type="primary" @click="boxModelFlag=false">关闭</el-button>
  324. </el-footer>
  325. </el-dialog>
  326. <!-- 装箱新增/修改栈板 -->
  327. <el-dialog
  328. :title="palletModelData.addFlag===1 ? '修改栈板' : '手工装箱'"
  329. :close-on-click-modal="false"
  330. v-drag
  331. :visible.sync="palletModelFlag"
  332. width="780px"
  333. class="pallet-dialog">
  334. <!-- 区域 1箱信息 -->
  335. <div class="section section-header">
  336. <h4 class="section-title">箱信息</h4>
  337. <el-divider></el-divider>
  338. <el-form label-position="top" class="box-info-form">
  339. <el-row :gutter="20">
  340. <el-col :span="8">
  341. <el-form-item label="箱数">
  342. <el-input v-model="palletModelData.boxQty" type="number" placeholder="请输入箱数" @input="calculateWeightsByBoxQty"></el-input>
  343. </el-form-item>
  344. </el-col>
  345. <el-col :span="8">
  346. <el-form-item label="毛重">
  347. <el-input v-model="palletModelData.grossWeight" type="number" placeholder="自动计算"></el-input>
  348. </el-form-item>
  349. </el-col>
  350. <el-col :span="8">
  351. <el-form-item label="净重">
  352. <el-input v-model="palletModelData.netWeight" type="number" placeholder="自动计算"></el-input>
  353. </el-form-item>
  354. </el-col>
  355. </el-row>
  356. </el-form>
  357. </div>
  358. <!-- 区域 2箱明细 -->
  359. <div class="section section-detail">
  360. <h4 class="section-title">箱明细</h4>
  361. <el-divider></el-divider>
  362. <div class="table-wrapper">
  363. <el-table
  364. ref="partTableRef"
  365. :data="dataList8"
  366. height="100%"
  367. stripe
  368. border
  369. class="zxClass"
  370. style="width: 100%;">
  371. <el-table-column prop="pn" label="PN" min-width="120"></el-table-column>
  372. <el-table-column prop="partDescription" label="Description" min-width="220"></el-table-column>
  373. <el-table-column prop="qty" label="原数量" align="right" width="70"></el-table-column>
  374. <el-table-column prop="surplusQty" label="可装箱数量" align="right" width="80"></el-table-column>
  375. <el-table-column label="装箱数量" align="center" width="80">
  376. <template slot-scope="scope">
  377. <el-input v-model.number="scope.row.useQty" type="number" :min="0" :max="999999" size="mini" @input="calculateRolls(scope.row)"></el-input>
  378. </template>
  379. </el-table-column>
  380. <el-table-column label="Rolls" align="center" width="80">
  381. <template slot-scope="scope">
  382. <el-input v-model.number="scope.row.rolls" type="number" :min="0" :max="999999" size="mini" placeholder="自动计算"></el-input>
  383. </template>
  384. </el-table-column>
  385. <el-table-column label="操作" align="center" width="70">
  386. <template slot-scope="scope">
  387. <a type="text" size="small" @click="fillUseQty(scope.row)">全数装箱</a>
  388. </template>
  389. </el-table-column>
  390. </el-table>
  391. </div>
  392. </div>
  393. <!-- 底部操作按钮 -->
  394. <div slot="footer" class="dialog-footer">
  395. <el-button type="primary" @click="savePalletHeader(0)">保存</el-button>
  396. <el-button type="primary" @click="savePalletHeader(1)">保存并关闭</el-button>
  397. <el-button @click="palletModelFlag=false">关闭</el-button>
  398. </div>
  399. </el-dialog>
  400. <el-dialog
  401. :title=" '修改栈板'"
  402. :close-on-click-modal="false"
  403. v-drag
  404. :visible.sync="palletEditFlag"
  405. width="240px"
  406. class="pallet-dialog">
  407. <div class="section section-header">
  408. <el-divider></el-divider>
  409. <el-form label-position="top" class="box-info-form">
  410. <el-row :gutter="20">
  411. <el-col :span="24">
  412. <el-form-item label="栈板高度(M)">
  413. <el-input v-model="palletModelData.height" type="number" placeholder="请输入栈板高度(M)"></el-input>
  414. </el-form-item>
  415. </el-col>
  416. <el-col :span="24">
  417. <el-form-item label="托数">
  418. <el-input v-model="palletModelData.palletQty" type="number" placeholder="请输入托数"></el-input>
  419. </el-form-item>
  420. </el-col>
  421. </el-row>
  422. </el-form>
  423. </div>
  424. <!-- 底部操作按钮 -->
  425. <div slot="footer" class="dialog-footer">
  426. <el-button type="primary" @click="updateCodelPalletHeaderPalletQty">保存</el-button>
  427. <el-button @click="palletEditFlag=false">关闭</el-button>
  428. </div>
  429. </el-dialog>
  430. <el-dialog title="一键装箱" :close-on-click-modal="false" v-drag :visible.sync="oneClickPackingModelFlag" width="170px">
  431. <el-form label-position="top" style="margin-left: 7px;margin-top: 10px;">
  432. <el-row :gutter="20">
  433. <el-col :span="12">
  434. <el-form-item :label="''" >
  435. <el-checkbox v-model="oneClickPackingModelData.boxRemnant">是否显示零数箱</el-checkbox>
  436. </el-form-item>
  437. </el-col>
  438. </el-row>
  439. </el-form>
  440. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  441. <el-button type="primary" @click="saveOneClickPacking()">保存</el-button>
  442. <el-button type="primary" @click="oneClickPackingModelFlag=false">关闭</el-button>
  443. </el-footer>
  444. </el-dialog>
  445. <el-dialog :close-on-click-modal="false" v-drag :visible.sync="palletMaintenanceModelFlag" width="450px">
  446. <div slot="title" class="dialog-title">
  447. <span>栈板维护</span>
  448. <el-tooltip effect="dark" placement="top">
  449. <div slot="content">
  450. <div>栈板维护功能说明</div>
  451. <div> 系统会自动加载当前BU下的所有栈板</div>
  452. <div> 栈板高度单位为米(M)请输入准确数值</div>
  453. <div> 只有托数大于0的栈板记录才会被保存</div>
  454. </div>
  455. <i class="el-icon-question" style="color: #17b3a3; margin-left: 8px; cursor: pointer; font-size: 16px;"></i>
  456. </el-tooltip>
  457. </div>
  458. <!-- 栈板记录列表 -->
  459. <div style="margin: 15px 0;">
  460. <el-table :data="palletMaintenanceRecords" border style="width: 100%; margin-bottom: 15px;" class="zxClass"
  461. max-height="200" v-if="palletMaintenanceRecords.length > 0">
  462. <el-table-column label="栈板类型" min-width="100">
  463. <template slot-scope="scope">
  464. <el-input v-model="scope.row.palletType" disabled style="width: 100%;"></el-input>
  465. </template>
  466. </el-table-column>
  467. <el-table-column width="120">
  468. <template slot="header">
  469. <span>栈板高度(M)</span>
  470. </template>
  471. <template slot-scope="scope">
  472. <el-input v-model="scope.row.height" type="text" placeholder="请输入高度" style="width: 100%;"></el-input>
  473. </template>
  474. </el-table-column>
  475. <el-table-column width="100">
  476. <template slot="header">
  477. <span>托数</span>
  478. </template>
  479. <template slot-scope="scope">
  480. <el-input v-model="scope.row.palletQty" type="text" placeholder="请输入托数" style="width: 100%;"></el-input>
  481. </template>
  482. </el-table-column>
  483. </el-table>
  484. <div v-if="palletMaintenanceRecords.length === 0" style="text-align: center; color: #999; padding: 20px; border: 1px dashed #ddd;">
  485. 正在加载栈板记录...
  486. </div>
  487. <!-- 操作提示 -->
  488. <div v-if="palletMaintenanceRecords.length > 0" style="margin-top: 10px; padding: 8px 12px; background: #f0f9ff; border: 1px solid #b3d8ff; border-radius: 4px; font-size: 12px; color: #409EFF;">
  489. <i class="el-icon-info" style="margin-right: 4px;"></i>
  490. <span>提示托数大于0的记录才会被保存</span>
  491. </div>
  492. </div>
  493. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  494. <el-button type="primary" @click="savePalletMaintenance()">确定</el-button>
  495. <el-button type="primary" @click="palletMaintenanceModelFlag=false">关闭</el-button>
  496. </el-footer>
  497. </el-dialog>
  498. <el-dialog title="物料信息" @close="closePartDialog" @open="openPartDialog" :visible.sync="partFlag" width="559px" v-drag>
  499. <el-form inline="inline" label-position="top" :model="partData" style="margin-left: 7px;margin-top: -5px;">
  500. </el-form>
  501. <el-table
  502. :height="height + 110"
  503. :data="partList"
  504. stripe
  505. highlight-current-row
  506. border
  507. @row-dblclick="partRowDblclick"
  508. style="width: 100%;">
  509. <el-table-column
  510. prop="pn"
  511. header-align="center"
  512. align="center"
  513. label="物料编码">
  514. </el-table-column>
  515. <el-table-column
  516. prop="part_desc"
  517. header-align="center"
  518. align="center"
  519. label="物料名称">
  520. </el-table-column>
  521. </el-table>
  522. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  523. <el-button @click="partFlag = false">关闭</el-button>
  524. </el-footer>
  525. </el-dialog>
  526. <el-dialog title="栈板" @close="closePalletDialog" @open="openPalletDialog" :visible.sync="palletFlag" width="559px" v-drag>
  527. <el-form inline="inline" label-position="top" :model="palletData" style="margin-left: 7px;margin-top: -5px;">
  528. <el-form-item label="栈板类型">
  529. <el-input v-model="palletData.palletType" clearable style="width: 110px"></el-input>
  530. </el-form-item>
  531. <el-form-item label=" ">
  532. <el-button type="primary" style="padding: 3px 12px" @click="searchPalletList()">查询</el-button>
  533. </el-form-item>
  534. </el-form>
  535. <el-table
  536. :height="height + 110"
  537. :data="palletList"
  538. stripe
  539. highlight-current-row
  540. border
  541. @row-dblclick="palletRowDblclick"
  542. style="width: 100%;">
  543. <el-table-column
  544. prop="palletNo"
  545. header-align="center"
  546. align="center"
  547. width="120"
  548. label="栈板编码">
  549. </el-table-column>
  550. <el-table-column
  551. prop="palletType"
  552. header-align="center"
  553. align="center"
  554. label="栈板类型">
  555. </el-table-column>
  556. <el-table-column
  557. prop="applicationArea"
  558. header-align="center"
  559. align="center"
  560. label="应用环境">
  561. </el-table-column>
  562. <el-table-column
  563. prop="length"
  564. header-align="center"
  565. align="center"
  566. label="长(M)">
  567. </el-table-column>
  568. <el-table-column
  569. prop="width"
  570. header-align="center"
  571. align="center"
  572. label="宽(M)">
  573. </el-table-column>
  574. <el-table-column
  575. prop="height"
  576. header-align="center"
  577. align="center"
  578. label="栈板高(M)">
  579. </el-table-column>
  580. </el-table>
  581. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  582. <el-button @click="palletFlag = false">关闭</el-button>
  583. </el-footer>
  584. </el-dialog>
  585. <!-- 导入 -->
  586. <pallet-upload-excel ref="palletUploadExcel" @refreshTable="searchPalletTable" v-drag></pallet-upload-excel>
  587. <!--列表的组件-->
  588. <Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
  589. </div>
  590. </template>
  591. <script>
  592. import Chooselist from '@/views/modules/common/Chooselist_eam'
  593. import {} from "@/api/sysLanguage.js"
  594. import palletUploadExcel from "./pallet_upload_excel.vue";
  595. import PackingDetailTab from "./components/PackingDetailTab.vue";
  596. import OssComponents from '../oss/ossComponents.vue'
  597. import {
  598. searchEcssCoDelNotifyHeaderForCK,
  599. searchEcssCoDelNotifyDetail,
  600. confirmEcssDel,
  601. updateEcssDel,
  602. cancerConfirmEcssDel,
  603. searchCoDelPalletDataNew,
  604. searchEcssCoDelPalletHeaderData,
  605. searchEcssCoDelPalletDetailData,
  606. savePalletHeader,
  607. deletePalletHeader,
  608. savePalletDetail,
  609. deletePalletDetail,
  610. saveOneClickPacking,
  611. savePalletMaintenance,
  612. getNotifyPartDetail,
  613. searchPalletList,
  614. updateExportFlag,
  615. updateCodelPalletHeaderPalletQty,
  616. getPartPackageProperties
  617. }from "@/api/ecss/ecss.js"
  618. import {getBuList}from '@/api/factory/site.js'
  619. import excel from "@/utils/excel-util.js";
  620. import excelOpts from '@/utils/export-options.js'
  621. import ExportUtil from "@/utils/export";
  622. import { getTableUserListLanguage} from "@/api/table.js"
  623. import {getTableDefaultListLanguage} from "../../../api/table";
  624. export default {
  625. name: "null",
  626. components:{
  627. OssComponents,
  628. palletUploadExcel,
  629. Chooselist,
  630. PackingDetailTab,
  631. },
  632. data() {
  633. return {
  634. multipleSelection: [],
  635. palletFlag:false,
  636. palletList:[],
  637. palletData:{},
  638. partFlag:false,
  639. partData:{},
  640. partList:[],
  641. pageIndex: 1,
  642. pageSize: 100,
  643. totalPage: 0,
  644. // 选中行持久化相关
  645. selectedRowKey: null, // 当前选中行的唯一标识
  646. height: 200,
  647. buList:[],
  648. dataList:[],
  649. dataList2:[],
  650. dataList3:[],
  651. dataList4:[],
  652. dataList5:[],
  653. dataList8:[],
  654. notifyDetailMap: new Map(),
  655. boxDetailData:{
  656. site:'',
  657. buNo:'',
  658. delNo:'',
  659. seqNo:'',
  660. },
  661. dataListLoading: false,
  662. boxDetailModelFlag: false,
  663. searchData: {
  664. page: 1,
  665. limit: 100,
  666. buNo:'',
  667. delNo:'',
  668. cmcInvoice:'',
  669. notifyStatus:'',
  670. startDate:'',
  671. endDate:'',
  672. exportFlag:'',
  673. username:this.$store.state.user.name,
  674. },
  675. oneClickPackingModelFlag:false,
  676. oneClickPackingModelData:{
  677. boxRemnant: false,
  678. },
  679. // 栈板维护相关
  680. palletMaintenanceModelFlag: false,
  681. palletMaintenanceRecords: [],
  682. palletModelFlag:false,
  683. palletEditFlag:false,
  684. palletModelData:{
  685. addFlag:0,
  686. site:'',
  687. buNo:'',
  688. delNo:'',
  689. seqNo:'',
  690. palletNo:'',
  691. palletQty:'',
  692. length:'',
  693. width:'',
  694. height:'',
  695. boxQty:'',
  696. grossWeight:'',
  697. netWeight:'',
  698. palletRemark:'',
  699. },
  700. boxModelFlag:false,
  701. boxModelData:{
  702. addFlag:0,
  703. site:'',
  704. buNo:'',
  705. delNo:'',
  706. seqNo:'',
  707. itemNo:'',
  708. partNo:'',
  709. pn:'',
  710. qty:'',
  711. poNo:'',
  712. boxQty:'',
  713. rolls:'',
  714. },
  715. buttons:{
  716. search:'查询',
  717. },
  718. confirmModelFlag:false,
  719. updateModelFlag:false,
  720. confirmModel:{
  721. site:'',
  722. buDesc:'',
  723. cmcInvoice:'',
  724. delNo:'',
  725. readyDate:'',
  726. shippingMode:'',
  727. destination:'',
  728. notifyDate:'',
  729. remark:'',
  730. },
  731. activeName:'detail',
  732. columnList1: [
  733. {
  734. userId: this.$store.state.user.name,
  735. functionId: 801002,
  736. serialNumber: '801002Table1BuDesc',
  737. tableId: "801002Table1",
  738. tableName: "关务系统发货通知单",
  739. columnProp: "buDesc",
  740. headerAlign: "center",
  741. align: "left",
  742. columnLabel: "BU",
  743. columnHidden: false,
  744. columnImage: false,
  745. columnSortable: false,
  746. sortLv: 0,
  747. status: true,
  748. fixed: '',
  749. columnWidth: 60
  750. },
  751. {
  752. userId: this.$store.state.user.name,
  753. functionId: 801002,
  754. serialNumber: '801002Table1CmcInvoice',
  755. tableId: "801002Table1",
  756. tableName: "关务系统发货通知单",
  757. columnProp: "cmcInvoice",
  758. headerAlign: "center",
  759. align: "left",
  760. columnLabel: "CMC Invoice",
  761. columnHidden: false,
  762. columnImage: false,
  763. columnSortable: false,
  764. sortLv: 0,
  765. status: true,
  766. fixed: '',
  767. columnWidth: 100
  768. },
  769. {
  770. userId: this.$store.state.user.name,
  771. functionId: 801002,
  772. serialNumber: '801002Table1DelNo',
  773. tableId: "801002Table1",
  774. tableName: "关务系统发货通知单",
  775. columnProp: "delNo",
  776. headerAlign: "center",
  777. align: "center",
  778. columnLabel: "发货通知单号",
  779. columnHidden: false,
  780. columnImage: false,
  781. columnSortable: false,
  782. sortLv: 0,
  783. status: true,
  784. fixed: '',
  785. columnWidth: 110
  786. },
  787. {
  788. userId: this.$store.state.user.name,
  789. functionId: 801002,
  790. serialNumber: '801002Table1ReadyDate',
  791. tableId: "801002Table1",
  792. tableName: "关务系统发货通知单",
  793. columnProp: "readyDate",
  794. headerAlign: "center",
  795. align: "center",
  796. columnLabel: "ReadyDate",
  797. columnHidden: false,
  798. columnImage: false,
  799. columnSortable: false,
  800. sortLv: 0,
  801. status: true,
  802. fixed: '',
  803. columnWidth: 100
  804. },
  805. {
  806. userId: this.$store.state.user.name,
  807. functionId: 801002,
  808. serialNumber: '801002Table1CustomerName',
  809. tableId: "801002Table1",
  810. tableName: "关务系统发货通知单",
  811. columnProp: "customerName",
  812. headerAlign: "center",
  813. align: "left",
  814. columnLabel: "客户名称",
  815. columnHidden: false,
  816. columnImage: false,
  817. columnSortable: false,
  818. sortLv: 0,
  819. status: true,
  820. fixed: '',
  821. columnWidth: 220
  822. },
  823. {
  824. userId: this.$store.state.user.name,
  825. functionId: 801002,
  826. serialNumber: '801002Table1ShippingMode',
  827. tableId: "801002Table1",
  828. tableName: "关务系统发货通知单",
  829. columnProp: "shippingMode",
  830. headerAlign: "center",
  831. align: "left",
  832. columnLabel: "ShippingMode",
  833. columnHidden: false,
  834. columnImage: false,
  835. columnSortable: false,
  836. sortLv: 0,
  837. status: true,
  838. fixed: '',
  839. columnWidth: 100
  840. },
  841. {
  842. userId: this.$store.state.user.name,
  843. functionId: 801002,
  844. serialNumber: '801002Table1Destination',
  845. tableId: "801002Table1",
  846. tableName: "关务系统发货通知单",
  847. columnProp: "destination",
  848. headerAlign: "center",
  849. align: "left",
  850. columnLabel: "Destination",
  851. columnHidden: false,
  852. columnImage: false,
  853. columnSortable: false,
  854. sortLv: 0,
  855. status: true,
  856. fixed: '',
  857. columnWidth: 100
  858. },
  859. {
  860. userId: this.$store.state.user.name,
  861. functionId: 801002,
  862. serialNumber: '801002Table1NotifyStatus',
  863. tableId: "801002Table1",
  864. tableName: "关务系统发货通知单",
  865. columnProp: "notifyStatus",
  866. headerAlign: "center",
  867. align: "left",
  868. columnLabel: "通知单状态",
  869. columnHidden: false,
  870. columnImage: false,
  871. columnSortable: false,
  872. sortLv: 0,
  873. status: true,
  874. fixed: '',
  875. columnWidth: 100
  876. },
  877. {
  878. userId: this.$store.state.user.name,
  879. functionId: 801001,
  880. serialNumber: '801001Table1NotifyStatus',
  881. tableId: "801001Table1",
  882. tableName: "关务系统发货通知单",
  883. columnProp: "modifyLabel",
  884. headerAlign: "center",
  885. align: "left",
  886. columnLabel: "改单",
  887. columnHidden: false,
  888. columnImage: false,
  889. columnSortable: false,
  890. sortLv: 0,
  891. status: true,
  892. fixed: '',
  893. columnWidth: 60
  894. },
  895. {
  896. userId: this.$store.state.user.name,
  897. functionId: 801002,
  898. serialNumber: '801002Table1ExportFlag',
  899. tableId: "801002Table1",
  900. tableName: "关务系统发货通知单",
  901. columnProp: "exportFlag",
  902. headerAlign: "center",
  903. align: "center",
  904. columnLabel: "是否导出",
  905. columnHidden: false,
  906. columnImage: false,
  907. columnSortable: false,
  908. sortLv: 0,
  909. status: true,
  910. fixed: '',
  911. columnWidth: 80
  912. },
  913. {
  914. userId: this.$store.state.user.name,
  915. functionId: 801002,
  916. serialNumber: '801002Table1NotifyDate',
  917. tableId: "801002Table1",
  918. tableName: "关务系统发货通知单",
  919. columnProp: "notifyDate",
  920. headerAlign: "center",
  921. align: "center",
  922. columnLabel: "发货日期",
  923. columnHidden: false,
  924. columnImage: false,
  925. columnSortable: false,
  926. sortLv: 0,
  927. status: true,
  928. fixed: '',
  929. columnWidth: 120
  930. },
  931. {
  932. userId: this.$store.state.user.name,
  933. functionId: 801002,
  934. serialNumber: '801002Table1ErpDelNo',
  935. tableId: "801002Table1",
  936. tableName: "关务系统发货通知单",
  937. columnProp: "walMartOrderFlag",
  938. headerAlign: "center",
  939. align: "left",
  940. columnLabel: "沃尔玛订单",
  941. columnHidden: false,
  942. columnImage: false,
  943. columnSortable: false,
  944. sortLv: 0,
  945. status: true,
  946. fixed: '',
  947. columnWidth: 100
  948. },
  949. {
  950. userId: this.$store.state.user.name,
  951. functionId: 801002,
  952. serialNumber: '801002Table1CreateBy',
  953. tableId: "801002Table1",
  954. tableName: "关务系统发货通知单",
  955. columnProp: "createBy",
  956. headerAlign: "center",
  957. align: "left",
  958. columnLabel: "创建人",
  959. columnHidden: false,
  960. columnImage: false,
  961. columnSortable: false,
  962. sortLv: 0,
  963. status: true,
  964. fixed: '',
  965. columnWidth: 80
  966. },
  967. {
  968. userId: this.$store.state.user.name,
  969. functionId: 801002,
  970. serialNumber: '801002Table1CreateDate',
  971. tableId: "801002Table1",
  972. tableName: "关务系统发货通知单",
  973. columnProp: "createDate",
  974. headerAlign: "center",
  975. align: "center",
  976. columnLabel: "创建时间",
  977. columnHidden: false,
  978. columnImage: false,
  979. columnSortable: false,
  980. sortLv: 0,
  981. status: true,
  982. fixed: '',
  983. columnWidth: 130
  984. },
  985. {
  986. userId: this.$store.state.user.name,
  987. functionId: 801002,
  988. serialNumber: '801002Table1UpdateBy',
  989. tableId: "801002Table1",
  990. tableName: "关务系统发货通知单",
  991. columnProp: "updateBy",
  992. headerAlign: "center",
  993. align: "left",
  994. columnLabel: "修改人",
  995. columnHidden: false,
  996. columnImage: false,
  997. columnSortable: false,
  998. sortLv: 0,
  999. status: true,
  1000. fixed: '',
  1001. columnWidth: 80
  1002. },
  1003. {
  1004. userId: this.$store.state.user.name,
  1005. functionId: 801002,
  1006. serialNumber: '801002Table1UpdateDate',
  1007. tableId: "801002Table1",
  1008. tableName: "关务系统发货通知单",
  1009. columnProp: "updateDate",
  1010. headerAlign: "center",
  1011. align: "center",
  1012. columnLabel: "修改时间",
  1013. columnHidden: false,
  1014. columnImage: false,
  1015. columnSortable: false,
  1016. sortLv: 0,
  1017. status: true,
  1018. fixed: '',
  1019. columnWidth: 130
  1020. },
  1021. {
  1022. userId: this.$store.state.user.name,
  1023. functionId: 801002,
  1024. serialNumber: '801002Table1Remark',
  1025. tableId: "801002Table1",
  1026. tableName: "关务系统发货通知单",
  1027. columnProp: "remark",
  1028. headerAlign: "center",
  1029. align: "left",
  1030. columnLabel: "Remark",
  1031. columnHidden: false,
  1032. columnImage: false,
  1033. columnSortable: false,
  1034. sortLv: 0,
  1035. status: true,
  1036. fixed: '',
  1037. columnWidth: 300
  1038. },
  1039. ],
  1040. columnList2: [
  1041. {
  1042. userId: this.$store.state.user.name,
  1043. functionId: 801002,
  1044. serialNumber: '801002Table2ItemNo',
  1045. tableId: "801002Table2",
  1046. tableName: "关务系统发货通知单明细",
  1047. columnProp: "itemNo",
  1048. headerAlign: "center",
  1049. align: "left",
  1050. columnLabel: "行号",
  1051. columnHidden: false,
  1052. columnImage: false,
  1053. columnSortable: false,
  1054. sortLv: 0,
  1055. status: true,
  1056. fixed: '',
  1057. columnWidth: 80
  1058. },
  1059. {
  1060. userId: this.$store.state.user.name,
  1061. functionId: 801002,
  1062. serialNumber: '801002Table2PartNo',
  1063. tableId: "801002Table2",
  1064. tableName: "关务系统发货通知单明细",
  1065. columnProp: "pn",
  1066. headerAlign: "center",
  1067. align: "left",
  1068. columnLabel: "PN",
  1069. columnHidden: false,
  1070. columnImage: false,
  1071. columnSortable: false,
  1072. sortLv: 0,
  1073. status: true,
  1074. fixed: '',
  1075. columnWidth: 100
  1076. },
  1077. {
  1078. userId: this.$store.state.user.name,
  1079. functionId: 801002,
  1080. serialNumber: '801002Table2PartDescription',
  1081. tableId: "801002Table2",
  1082. tableName: "关务系统发货通知单明细",
  1083. columnProp: "partDescription",
  1084. headerAlign: "center",
  1085. align: "left",
  1086. columnLabel: "Description",
  1087. columnHidden: false,
  1088. columnImage: false,
  1089. columnSortable: false,
  1090. sortLv: 0,
  1091. status: true,
  1092. fixed: '',
  1093. columnWidth: 300
  1094. },
  1095. {
  1096. userId: this.$store.state.user.name,
  1097. functionId: 801002,
  1098. serialNumber: '801002Table2Qty',
  1099. tableId: "801002Table2",
  1100. tableName: "关务系统发货通知单明细",
  1101. columnProp: "qty",
  1102. headerAlign: "center",
  1103. align: "right",
  1104. columnLabel: "Qty (pcs)",
  1105. columnHidden: false,
  1106. columnImage: false,
  1107. columnSortable: false,
  1108. sortLv: 0,
  1109. status: true,
  1110. fixed: '',
  1111. columnWidth: 100
  1112. },
  1113. {
  1114. userId: this.$store.state.user.name,
  1115. functionId: 801002,
  1116. serialNumber: '801002Table2SalesOrder',
  1117. tableId: "801002Table2",
  1118. tableName: "关务系统发货通知单明细",
  1119. columnProp: "salesOrder",
  1120. headerAlign: "center",
  1121. align: "left",
  1122. columnLabel: "销售订单号",
  1123. columnHidden: false,
  1124. columnImage: false,
  1125. columnSortable: false,
  1126. sortLv: 0,
  1127. status: true,
  1128. fixed: '',
  1129. columnWidth: 100
  1130. },
  1131. {
  1132. userId: this.$store.state.user.name,
  1133. functionId: 801002,
  1134. serialNumber: '801002Table2CustomerPO',
  1135. tableId: "801002Table2",
  1136. tableName: "关务系统发货通知单明细",
  1137. columnProp: "customerPO",
  1138. headerAlign: "center",
  1139. align: "left",
  1140. columnLabel: "客户采购单号",
  1141. columnHidden: false,
  1142. columnImage: false,
  1143. columnSortable: false,
  1144. sortLv: 0,
  1145. status: true,
  1146. fixed: '',
  1147. columnWidth: 100
  1148. },
  1149. {
  1150. userId: this.$store.state.user.name,
  1151. functionId: 801002,
  1152. serialNumber: '801002Table2Version',
  1153. tableId: "801002Table2",
  1154. tableName: "关务系统发货通知单明细",
  1155. columnProp: "version",
  1156. headerAlign: "center",
  1157. align: "left",
  1158. columnLabel: "Version",
  1159. columnHidden: false,
  1160. columnImage: false,
  1161. columnSortable: false,
  1162. sortLv: 0,
  1163. status: true,
  1164. fixed: '',
  1165. columnWidth: 100
  1166. },
  1167. {
  1168. userId: this.$store.state.user.name,
  1169. functionId: 801002,
  1170. serialNumber: '801002Table2Status',
  1171. tableId: "801002Table2",
  1172. tableName: "关务系统发货通知单明细",
  1173. columnProp: "status",
  1174. headerAlign: "center",
  1175. align: "left",
  1176. columnLabel: "Status",
  1177. columnHidden: false,
  1178. columnImage: false,
  1179. columnSortable: false,
  1180. sortLv: 0,
  1181. status: true,
  1182. fixed: '',
  1183. columnWidth: 100
  1184. },
  1185. {
  1186. userId: this.$store.state.user.name,
  1187. functionId: 801002,
  1188. serialNumber: '801002Table2Family',
  1189. tableId: "801002Table2",
  1190. tableName: "关务系统发货通知单明细",
  1191. columnProp: "family",
  1192. headerAlign: "center",
  1193. align: "left",
  1194. columnLabel: "Family",
  1195. columnHidden: false,
  1196. columnImage: false,
  1197. columnSortable: false,
  1198. sortLv: 0,
  1199. status: true,
  1200. fixed: '',
  1201. columnWidth: 100
  1202. },
  1203. {
  1204. userId: this.$store.state.user.name,
  1205. functionId: 801002,
  1206. serialNumber: '801002Table2Lt',
  1207. tableId: "801002Table2",
  1208. tableName: "关务系统发货通知单明细",
  1209. columnProp: "lt",
  1210. headerAlign: "center",
  1211. align: "right",
  1212. columnLabel: "LT (wks)",
  1213. columnHidden: false,
  1214. columnImage: false,
  1215. columnSortable: false,
  1216. sortLv: 0,
  1217. status: true,
  1218. fixed: '',
  1219. columnWidth: 100
  1220. },
  1221. {
  1222. userId: this.$store.state.user.name,
  1223. functionId: 801002,
  1224. serialNumber: '801002Table2CmcComment',
  1225. tableId: "801002Table2",
  1226. tableName: "关务系统发货通知单明细",
  1227. columnProp: "cmcComment",
  1228. headerAlign: "center",
  1229. align: "left",
  1230. columnLabel: "CMC Comment",
  1231. columnHidden: false,
  1232. columnImage: false,
  1233. columnSortable: false,
  1234. sortLv: 0,
  1235. status: true,
  1236. fixed: '',
  1237. columnWidth: 100
  1238. },
  1239. {
  1240. userId: this.$store.state.user.name,
  1241. functionId: 801002,
  1242. serialNumber: '801002Table2SaleType',
  1243. tableId: "801002Table2",
  1244. tableName: "关务系统发货通知单明细",
  1245. columnProp: "saleType",
  1246. headerAlign: "center",
  1247. align: "left",
  1248. columnLabel: "内外销方式",
  1249. columnHidden: false,
  1250. columnImage: false,
  1251. columnSortable: false,
  1252. sortLv: 0,
  1253. status: true,
  1254. fixed: '',
  1255. columnWidth: 100
  1256. },
  1257. {
  1258. userId: this.$store.state.user.name,
  1259. functionId: 801002,
  1260. serialNumber: '801002Table2AwbBl',
  1261. tableId: "801002Table2",
  1262. tableName: "关务系统发货通知单明细",
  1263. columnProp: "awbBl",
  1264. headerAlign: "center",
  1265. align: "left",
  1266. columnLabel: "AWB/ BL#",
  1267. columnHidden: false,
  1268. columnImage: false,
  1269. columnSortable: false,
  1270. sortLv: 0,
  1271. status: true,
  1272. fixed: '',
  1273. columnWidth: 100
  1274. },
  1275. {
  1276. userId: this.$store.state.user.name,
  1277. functionId: 801002,
  1278. serialNumber: '801002Table2ShippingNumber',
  1279. tableId: "801002Table2",
  1280. tableName: "关务系统发货通知单明细",
  1281. columnProp: "shippingNumber",
  1282. headerAlign: "center",
  1283. align: "left",
  1284. columnLabel: "ShippingNumber",
  1285. columnHidden: false,
  1286. columnImage: false,
  1287. columnSortable: false,
  1288. sortLv: 0,
  1289. status: true,
  1290. fixed: '',
  1291. columnWidth: 100
  1292. },
  1293. {
  1294. userId: this.$store.state.user.name,
  1295. functionId: 801002,
  1296. serialNumber: '801002Table2ForwarderInfo',
  1297. tableId: "801002Table2",
  1298. tableName: "关务系统发货通知单明细",
  1299. columnProp: "forwarderInfo",
  1300. headerAlign: "center",
  1301. align: "left",
  1302. columnLabel: "Forwarder Info",
  1303. columnHidden: false,
  1304. columnImage: false,
  1305. columnSortable: false,
  1306. sortLv: 0,
  1307. status: true,
  1308. fixed: '',
  1309. columnWidth: 100
  1310. },
  1311. {
  1312. userId: this.$store.state.user.name,
  1313. functionId: 801002,
  1314. serialNumber: '801002Table2Currency',
  1315. tableId: "801002Table2",
  1316. tableName: "关务系统发货通知单明细",
  1317. columnProp: "currency",
  1318. headerAlign: "center",
  1319. align: "left",
  1320. columnLabel: "Currency",
  1321. columnHidden: false,
  1322. columnImage: false,
  1323. columnSortable: false,
  1324. sortLv: 0,
  1325. status: true,
  1326. fixed: '',
  1327. columnWidth: 100
  1328. },
  1329. {
  1330. userId: this.$store.state.user.name,
  1331. functionId: 801002,
  1332. serialNumber: '801002Table2Tp',
  1333. tableId: "801002Table2",
  1334. tableName: "关务系统发货通知单明细",
  1335. columnProp: "tp",
  1336. headerAlign: "center",
  1337. align: "right",
  1338. columnLabel: "TP",
  1339. columnHidden: false,
  1340. columnImage: false,
  1341. columnSortable: false,
  1342. sortLv: 0,
  1343. status: true,
  1344. fixed: '',
  1345. columnWidth: 80
  1346. },
  1347. {
  1348. userId: this.$store.state.user.name,
  1349. functionId: 801002,
  1350. serialNumber: '801002Table2TtlAmount',
  1351. tableId: "801002Table2",
  1352. tableName: "关务系统发货通知单明细",
  1353. columnProp: "ttlAmount",
  1354. headerAlign: "center",
  1355. align: "right",
  1356. columnLabel: "TTL Amount",
  1357. columnHidden: false,
  1358. columnImage: false,
  1359. columnSortable: false,
  1360. sortLv: 0,
  1361. status: true,
  1362. fixed: '',
  1363. columnWidth: 80
  1364. },
  1365. {
  1366. userId: this.$store.state.user.name,
  1367. functionId: 801001,
  1368. serialNumber: '801001Table2Remark',
  1369. tableId: "801001Table2",
  1370. tableName: "关务系统发货通知单明细",
  1371. columnProp: "vat",
  1372. headerAlign: "center",
  1373. align: "right",
  1374. columnLabel: "VAT",
  1375. columnHidden: false,
  1376. columnImage: false,
  1377. columnSortable: false,
  1378. sortLv: 0,
  1379. status: true,
  1380. fixed: '',
  1381. columnWidth: 100
  1382. },
  1383. {
  1384. userId: this.$store.state.user.name,
  1385. functionId: 801002,
  1386. serialNumber: '801002Table2SumPrice',
  1387. tableId: "801002Table2",
  1388. tableName: "关务系统发货通知单明细",
  1389. columnProp: "sumPrice",
  1390. headerAlign: "center",
  1391. align: "right",
  1392. columnLabel: "价税合计",
  1393. columnHidden: false,
  1394. columnImage: false,
  1395. columnSortable: false,
  1396. sortLv: 0,
  1397. status: true,
  1398. fixed: '',
  1399. columnWidth: 80
  1400. },
  1401. {
  1402. userId: this.$store.state.user.name,
  1403. functionId: 801002,
  1404. serialNumber: '801002Table2So',
  1405. tableId: "801002Table2",
  1406. tableName: "关务系统发货通知单明细",
  1407. columnProp: "so",
  1408. headerAlign: "center",
  1409. align: "left",
  1410. columnLabel: "SO",
  1411. columnHidden: false,
  1412. columnImage: false,
  1413. columnSortable: false,
  1414. sortLv: 0,
  1415. status: true,
  1416. fixed: '',
  1417. columnWidth: 100
  1418. },
  1419. {
  1420. userId: this.$store.state.user.name,
  1421. functionId: 801002,
  1422. serialNumber: '801002Table2Upc',
  1423. tableId: "801002Table2",
  1424. tableName: "关务系统发货通知单明细",
  1425. columnProp: "upc",
  1426. headerAlign: "center",
  1427. align: "left",
  1428. columnLabel: "UPC",
  1429. columnHidden: false,
  1430. columnImage: false,
  1431. columnSortable: false,
  1432. sortLv: 0,
  1433. status: true,
  1434. fixed: '',
  1435. columnWidth: 100
  1436. },
  1437. {
  1438. userId: this.$store.state.user.name,
  1439. functionId: 801002,
  1440. serialNumber: '801002Table2Remark',
  1441. tableId: "801002Table2",
  1442. tableName: "关务系统发货通知单明细",
  1443. columnProp: "remark",
  1444. headerAlign: "center",
  1445. align: "left",
  1446. columnLabel: "Remark",
  1447. columnHidden: false,
  1448. columnImage: false,
  1449. columnSortable: false,
  1450. sortLv: 0,
  1451. status: true,
  1452. fixed: '',
  1453. columnWidth: 300
  1454. },
  1455. {
  1456. userId: this.$store.state.user.name,
  1457. functionId: 801001,
  1458. serialNumber: '801001Table2Remark',
  1459. tableId: "801001Table2",
  1460. tableName: "关务系统发货通知单明细",
  1461. columnProp: "roll",
  1462. headerAlign: "center",
  1463. align: "right",
  1464. columnLabel: "Roll",
  1465. columnHidden: false,
  1466. columnImage: false,
  1467. columnSortable: false,
  1468. sortLv: 0,
  1469. status: true,
  1470. fixed: '',
  1471. columnWidth: 100
  1472. },
  1473. {
  1474. userId: this.$store.state.user.name,
  1475. functionId: 801001,
  1476. serialNumber: '801001Table2Remark',
  1477. tableId: "801001Table2",
  1478. tableName: "关务系统发货通知单明细",
  1479. columnProp: "carton",
  1480. headerAlign: "center",
  1481. align: "right",
  1482. columnLabel: "Carton",
  1483. columnHidden: false,
  1484. columnImage: false,
  1485. columnSortable: false,
  1486. sortLv: 0,
  1487. status: true,
  1488. fixed: '',
  1489. columnWidth: 100
  1490. },
  1491. {
  1492. userId: this.$store.state.user.name,
  1493. functionId: 801001,
  1494. serialNumber: '801001Table2Remark',
  1495. tableId: "801001Table2",
  1496. tableName: "关务系统发货通知单明细",
  1497. columnProp: "qtyRoll",
  1498. headerAlign: "center",
  1499. align: "right",
  1500. columnLabel: "qty/roll",
  1501. columnHidden: false,
  1502. columnImage: false,
  1503. columnSortable: false,
  1504. sortLv: 0,
  1505. status: true,
  1506. fixed: '',
  1507. columnWidth: 100
  1508. },
  1509. {
  1510. userId: this.$store.state.user.name,
  1511. functionId: 801001,
  1512. serialNumber: '801001Table2Remark',
  1513. tableId: "801001Table2",
  1514. tableName: "关务系统发货通知单明细",
  1515. columnProp: "qtyBox",
  1516. headerAlign: "center",
  1517. align: "right",
  1518. columnLabel: "qty/box",
  1519. columnHidden: false,
  1520. columnImage: false,
  1521. columnSortable: false,
  1522. sortLv: 0,
  1523. status: true,
  1524. fixed: '',
  1525. columnWidth: 100
  1526. },
  1527. ],
  1528. columnList3:[
  1529. {
  1530. userId: this.$store.state.user.name,
  1531. functionId: 801002,
  1532. serialNumber: '801002Table3ItemNo',
  1533. tableId: "801002Table3",
  1534. tableName: "装箱明细",
  1535. columnProp: "itemNo",
  1536. headerAlign: "center",
  1537. align: "right",
  1538. columnLabel: "序号",
  1539. columnHidden: false,
  1540. columnImage: false,
  1541. columnSortable: false,
  1542. sortLv: 0,
  1543. status: true,
  1544. fixed: '',
  1545. columnWidth: 40
  1546. },
  1547. {
  1548. userId: this.$store.state.user.name,
  1549. functionId: 801002,
  1550. serialNumber: '801002Table3PoNo',
  1551. tableId: "801002Table3",
  1552. tableName: "装箱明细",
  1553. columnProp: "poNo",
  1554. headerAlign: "center",
  1555. align: "left",
  1556. columnLabel: "PO",
  1557. columnHidden: false,
  1558. columnImage: false,
  1559. columnSortable: false,
  1560. sortLv: 0,
  1561. status: true,
  1562. fixed: '',
  1563. columnWidth: 100
  1564. },
  1565. {
  1566. userId: this.$store.state.user.name,
  1567. functionId: 801002,
  1568. serialNumber: '801002Table3PN',
  1569. tableId: "801002Table3",
  1570. tableName: "装箱明细",
  1571. columnProp: "pn",
  1572. headerAlign: "center",
  1573. align: "left",
  1574. columnLabel: "PN",
  1575. columnHidden: false,
  1576. columnImage: false,
  1577. columnSortable: false,
  1578. sortLv: 0,
  1579. status: true,
  1580. fixed: '',
  1581. columnWidth: 100
  1582. },
  1583. {
  1584. userId: this.$store.state.user.name,
  1585. functionId: 801002,
  1586. serialNumber: '801002Table3Qty',
  1587. tableId: "801002Table3",
  1588. tableName: "装箱明细",
  1589. columnProp: "qty",
  1590. headerAlign: "center",
  1591. align: "right",
  1592. columnLabel: "数量",
  1593. columnHidden: false,
  1594. columnImage: false,
  1595. columnSortable: false,
  1596. sortLv: 0,
  1597. status: true,
  1598. fixed: '',
  1599. columnWidth: 50
  1600. },
  1601. {
  1602. userId: this.$store.state.user.name,
  1603. functionId: 801002,
  1604. serialNumber: '801002Table3Rolls',
  1605. tableId: "801002Table3",
  1606. tableName: "装箱明细",
  1607. columnProp: "rolls",
  1608. headerAlign: "center",
  1609. align: "right",
  1610. columnLabel: "Rolls",
  1611. columnHidden: false,
  1612. columnImage: false,
  1613. columnSortable: false,
  1614. sortLv: 0,
  1615. status: true,
  1616. fixed: '',
  1617. columnWidth: 50
  1618. },
  1619. ],
  1620. columnList4:[
  1621. {
  1622. userId: this.$store.state.user.name,
  1623. functionId: 801002,
  1624. serialNumber: '801002Table4SeqNo',
  1625. tableId: "801002Table4",
  1626. tableName: "装箱栈板主表",
  1627. columnProp: "seqNo",
  1628. headerAlign: "center",
  1629. align: "right",
  1630. columnLabel: "序号",
  1631. columnHidden: false,
  1632. columnImage: false,
  1633. columnSortable: false,
  1634. sortLv: 0,
  1635. status: true,
  1636. fixed: '',
  1637. columnWidth: 40
  1638. },
  1639. {
  1640. userId: this.$store.state.user.name,
  1641. functionId: 801002,
  1642. serialNumber: '801002Table4PalletRemark',
  1643. tableId: "801002Table4",
  1644. tableName: "装箱栈板主表",
  1645. columnProp: "palletRemark",
  1646. headerAlign: "center",
  1647. align: "left",
  1648. columnLabel: "栈板码",
  1649. columnHidden: false,
  1650. columnImage: false,
  1651. columnSortable: false,
  1652. sortLv: 0,
  1653. status: true,
  1654. fixed: '',
  1655. columnWidth: 60
  1656. },
  1657. {
  1658. userId: this.$store.state.user.name,
  1659. functionId: 801002,
  1660. serialNumber: '801002Table4PalletQty',
  1661. tableId: "801002Table4",
  1662. tableName: "装箱栈板主表",
  1663. columnProp: "palletQty",
  1664. headerAlign: "center",
  1665. align: "right",
  1666. columnLabel: "数量",
  1667. columnHidden: false,
  1668. columnImage: false,
  1669. columnSortable: false,
  1670. sortLv: 0,
  1671. status: true,
  1672. fixed: '',
  1673. columnWidth: 50
  1674. },
  1675. {
  1676. userId: this.$store.state.user.name,
  1677. functionId: 801002,
  1678. serialNumber: '801002Table4PalletQty',
  1679. tableId: "801002Table4",
  1680. tableName: "装箱栈板主表",
  1681. columnProp: "weight",
  1682. headerAlign: "center",
  1683. align: "right",
  1684. columnLabel: "重量(KG)",
  1685. columnHidden: false,
  1686. columnImage: false,
  1687. columnSortable: false,
  1688. sortLv: 0,
  1689. status: true,
  1690. fixed: '',
  1691. columnWidth: 50
  1692. },
  1693. {
  1694. userId: this.$store.state.user.name,
  1695. functionId: 801002,
  1696. serialNumber: '801002Table4Length',
  1697. tableId: "801002Table4",
  1698. tableName: "装箱栈板主表",
  1699. columnProp: "length",
  1700. headerAlign: "center",
  1701. align: "right",
  1702. columnLabel: "长(M)",
  1703. columnHidden: false,
  1704. columnImage: false,
  1705. columnSortable: false,
  1706. sortLv: 0,
  1707. status: true,
  1708. fixed: '',
  1709. columnWidth: 50
  1710. },
  1711. {
  1712. userId: this.$store.state.user.name,
  1713. functionId: 801002,
  1714. serialNumber: '801002Table4Width',
  1715. tableId: "801002Table4",
  1716. tableName: "装箱栈板主表",
  1717. columnProp: "width",
  1718. headerAlign: "center",
  1719. align: "right",
  1720. columnLabel: "宽(M)",
  1721. columnHidden: false,
  1722. columnImage: false,
  1723. columnSortable: false,
  1724. sortLv: 0,
  1725. status: true,
  1726. fixed: '',
  1727. columnWidth: 50
  1728. },
  1729. {
  1730. userId: this.$store.state.user.name,
  1731. functionId: 801002,
  1732. serialNumber: '801002Table4Height',
  1733. tableId: "801002Table4",
  1734. tableName: "装箱栈板主表",
  1735. columnProp: "height",
  1736. headerAlign: "center",
  1737. align: "right",
  1738. columnLabel: "高(M)",
  1739. columnHidden: false,
  1740. columnImage: false,
  1741. columnSortable: false,
  1742. sortLv: 0,
  1743. status: true,
  1744. fixed: '',
  1745. columnWidth: 50
  1746. },
  1747. ],
  1748. columnList5:[
  1749. {
  1750. userId: this.$store.state.user.name,
  1751. functionId: 801002,
  1752. serialNumber: '801002Table5PartNo',
  1753. tableId: "801002Table5",
  1754. tableName: "栈板装箱明细",
  1755. columnProp: "pn",
  1756. headerAlign: "center",
  1757. align: "left",
  1758. columnLabel: "物料编码",
  1759. columnHidden: false,
  1760. columnImage: false,
  1761. columnSortable: false,
  1762. sortLv: 0,
  1763. status: true,
  1764. fixed: '',
  1765. columnWidth: 70
  1766. },
  1767. {
  1768. userId: this.$store.state.user.name,
  1769. functionId: 801002,
  1770. serialNumber: '801002Table5Qty',
  1771. tableId: "801002Table5",
  1772. tableName: "栈板装箱明细",
  1773. columnProp: "qty",
  1774. headerAlign: "center",
  1775. align: "right",
  1776. columnLabel: "数量",
  1777. columnHidden: false,
  1778. columnImage: false,
  1779. columnSortable: false,
  1780. sortLv: 0,
  1781. status: true,
  1782. fixed: '',
  1783. columnWidth: 80
  1784. },
  1785. {
  1786. userId: this.$store.state.user.name,
  1787. functionId: 801002,
  1788. serialNumber: '801002Table5BoxQty',
  1789. tableId: "801002Table5",
  1790. tableName: "栈板装箱明细",
  1791. columnProp: "boxQty",
  1792. headerAlign: "center",
  1793. align: "right",
  1794. columnLabel: "箱数",
  1795. columnHidden: false,
  1796. columnImage: false,
  1797. columnSortable: false,
  1798. sortLv: 0,
  1799. status: true,
  1800. fixed: '',
  1801. columnWidth: 70
  1802. },
  1803. {
  1804. userId: this.$store.state.user.name,
  1805. functionId: 801002,
  1806. serialNumber: '801002Table5Rolls',
  1807. tableId: "801002Table5",
  1808. tableName: "栈板装箱明细",
  1809. columnProp: "rolls",
  1810. headerAlign: "center",
  1811. align: "right",
  1812. columnLabel: "Rolls",
  1813. columnHidden: false,
  1814. columnImage: false,
  1815. columnSortable: false,
  1816. sortLv: 0,
  1817. status: true,
  1818. fixed: '',
  1819. columnWidth: 70
  1820. },
  1821. ],
  1822. ossColumns:[
  1823. {
  1824. userId: this.$store.state.user.name,
  1825. functionId: 103001,
  1826. serialNumber: '103001Table2FileName',
  1827. tableId: '103001Table2',
  1828. tableName: '文件信息表',
  1829. columnProp: 'fileName',
  1830. headerAlign: 'center',
  1831. align: 'center',
  1832. columnLabel: '文件名称',
  1833. columnHidden: false,
  1834. columnImage: false,
  1835. columnSortable: false,
  1836. sortLv: 0,
  1837. status: true,
  1838. fixed: '',
  1839. columnWidth: 140
  1840. },
  1841. {
  1842. userId: this.$store.state.user.name,
  1843. functionId: 103001,
  1844. serialNumber: '103001Table2FileRemark',
  1845. tableId: '103001Table2',
  1846. tableName: '文件信息表',
  1847. columnProp: 'fileRemark',
  1848. headerAlign: 'center',
  1849. align: 'center',
  1850. columnLabel: '备注',
  1851. columnHidden: false,
  1852. columnImage: false,
  1853. columnSortable: false,
  1854. sortLv: 0,
  1855. status: true,
  1856. fixed: '',
  1857. columnWidth: 240
  1858. },
  1859. {
  1860. userId: this.$store.state.user.name,
  1861. functionId: 103001,
  1862. serialNumber: '103001Table2CreateDate',
  1863. tableId: '103001Table2',
  1864. tableName: '文件信息表',
  1865. columnProp: 'createDate',
  1866. headerAlign: 'center',
  1867. align: 'center',
  1868. columnLabel: '上传时间',
  1869. columnHidden: false,
  1870. columnImage: false,
  1871. columnSortable: false,
  1872. sortLv: 0,
  1873. status: true,
  1874. fixed: '',
  1875. columnWidth: 140
  1876. },
  1877. {
  1878. userId: this.$store.state.user.name,
  1879. functionId: 103001,
  1880. serialNumber: '103001Table2CreatedBy',
  1881. tableId: '103001Table2',
  1882. tableName: '文件信息表',
  1883. columnProp: 'createdBy',
  1884. headerAlign: 'center',
  1885. align: 'center',
  1886. columnLabel: '上传人',
  1887. columnHidden: false,
  1888. columnImage: false,
  1889. columnSortable: false,
  1890. sortLv: 0,
  1891. status: true,
  1892. fixed: '',
  1893. columnWidth: 140
  1894. }
  1895. ],
  1896. currentRow:{},
  1897. }
  1898. },
  1899. mounted() {
  1900. this.$nextTick(() => {
  1901. this.height = (window.innerHeight - 260)/2;
  1902. })
  1903. },
  1904. methods: {
  1905. // 动态列开始 获取 用户保存的 格式列
  1906. async getTableUserColumn (tableId, columnId) {
  1907. let queryTableUser = {
  1908. userId: this.$store.state.user.name,
  1909. functionId: this.$route.meta.menuId,
  1910. tableId: tableId,
  1911. status: true,
  1912. languageCode: this.$i18n.locale
  1913. }
  1914. await getTableUserListLanguage(queryTableUser).then(({data}) => {
  1915. if (data.rows.length > 0) {
  1916. //this.columnList1 = []
  1917. switch (columnId) {
  1918. case 1:
  1919. this.columnList1 = data.rows
  1920. break;
  1921. // case 2:
  1922. // this.columnDetailList = data.rows
  1923. // break;
  1924. // case 3:
  1925. // this.columnList2 = data.rows
  1926. // break;
  1927. // case 4:
  1928. // this.columnList3 = data.rows
  1929. // break;
  1930. }
  1931. } else {
  1932. this.getColumnList(tableId, columnId)
  1933. }
  1934. })
  1935. },
  1936. // 获取 tableDefault 列
  1937. async getColumnList (tableId, columnId) {
  1938. let queryTable = {
  1939. functionId: this.$route.meta.menuId,
  1940. tableId: tableId,
  1941. languageCode: this.$i18n.locale
  1942. }
  1943. await getTableDefaultListLanguage(queryTable).then(({data}) => {
  1944. if (!data.rows.length == 0) {
  1945. switch (columnId) {
  1946. case 1:
  1947. this.columnList1 = data.rows
  1948. break;
  1949. // case 2:
  1950. // this.columnDetailList = data.rows
  1951. // break;
  1952. // case 3:
  1953. // this.columnList2 = data.rows
  1954. // break;
  1955. // case 4:
  1956. // this.columnList3 = data.rows
  1957. // break;
  1958. }
  1959. } else {
  1960. // this.showDefault = true.
  1961. }
  1962. })
  1963. },
  1964. isPnDataIncomplete(row) {
  1965. const hasBoxrolls = row.boxrolls !== null && row.boxrolls !== undefined && row.boxrolls !== '';
  1966. const hasRollqty = row.rollqty !== null && row.rollqty !== undefined && row.rollqty !== '';
  1967. const hasBoxweight = row.boxweight !== null && row.boxweight !== undefined && row.boxweight !== '';
  1968. const packageNo = row.packageNo !== null && row.packageNo !== undefined && row.packageNo !== '';
  1969. return !hasBoxrolls || !hasRollqty || !hasBoxweight || !packageNo;
  1970. },
  1971. // 获取PN数据缺失的具体字段提示信息
  1972. getPnIncompleteTooltip(row) {
  1973. const missingFields = [];
  1974. // 检查每个字段是否缺失
  1975. if (!(row.rollqty !== null && row.rollqty !== undefined && row.rollqty !== '')) {
  1976. missingFields.push('每卷数量');
  1977. }
  1978. if (!(row.boxrolls !== null && row.boxrolls !== undefined && row.boxrolls !== '')) {
  1979. missingFields.push('每箱卷数');
  1980. }
  1981. if (!(row.boxweight !== null && row.boxweight !== undefined && row.boxweight !== '')) {
  1982. missingFields.push('箱重量');
  1983. }
  1984. if (!(row.packageNo !== null && row.packageNo !== undefined && row.packageNo !== '')) {
  1985. missingFields.push('箱类型');
  1986. }
  1987. // 根据缺失字段生成提示信息
  1988. if (missingFields.length > 0) {
  1989. return `基本信息(${missingFields.join('、')})未维护,点击跳转到维护页面`;
  1990. }
  1991. return '';
  1992. },
  1993. // 跳转到PN维护页面
  1994. navigateToPartHsCode(pn) {
  1995. if (!pn) {
  1996. this.$message.warning('PN不能为空');
  1997. return;
  1998. }
  1999. this.$router.push({
  2000. path: '/ecss-partHsCode',
  2001. query: {
  2002. sku: pn
  2003. }
  2004. });
  2005. },
  2006. openPartDialog () {
  2007. this.searchPartList();
  2008. this.partFlag = true
  2009. },
  2010. closePartDialog () {
  2011. this.partList = []
  2012. this.partFlag = false
  2013. },
  2014. searchPartList () {
  2015. this.partData.site = this.currentRow.site
  2016. this.partData.delNo = this.currentRow.delNo
  2017. getNotifyPartDetail(this.partData).then(({data}) => {
  2018. if (data && data.code === 0){
  2019. this.partList = data.rows;
  2020. }
  2021. })
  2022. },
  2023. partRowDblclick (row) {
  2024. this.boxModelData.partNo = row.partNo
  2025. this.boxModelData.pn = row.pn
  2026. this.partFlag = false
  2027. },
  2028. // 获取基础数据列表S
  2029. getBaseList(val, type) {
  2030. this.tagNo = val
  2031. this.$nextTick(() => {
  2032. let strVal = ''
  2033. if (val === 507) {
  2034. strVal = this.boxModelData.partNo
  2035. }
  2036. this.$refs.baseList.init(val, strVal)
  2037. })
  2038. },
  2039. /* 列表方法的回调 */
  2040. getBaseData(val) {
  2041. if (this.tagNo === 507) {
  2042. this.boxModelData.partNo = val.part_no
  2043. }
  2044. },
  2045. // 每页数
  2046. sizeChangeHandle (val) {
  2047. this.pageSize = val
  2048. this.pageIndex = 1
  2049. this.searchTable()
  2050. },
  2051. // 当前页
  2052. currentChangeHandle (val) {
  2053. this.pageIndex = val
  2054. this.searchTable()
  2055. },
  2056. searchTable(){
  2057. this.searchData.limit = this.pageSize
  2058. this.searchData.page = this.pageIndex
  2059. searchEcssCoDelNotifyHeaderForCK(this.searchData).then(({data}) => {
  2060. //区分请求成功和失败的状况
  2061. if (data && data.code == 0) {
  2062. this.dataList = data.page.list
  2063. this.pageIndex = data.page.currPage
  2064. this.pageSize = data.page.pageSize
  2065. this.totalPage = data.page.totalCount
  2066. if(this.dataList.length>0){
  2067. this.dataList.forEach(o => {
  2068. if (o.notifyStatus==='仓库已确认'&&!o.notifyDate) {
  2069. o.notifyDate='发货日期不确定'
  2070. }
  2071. // 显示改单次数,如:改单(1)、改单(2)
  2072. o.modifyLabel = !!o.modifyFlag ? (o.modifyCount ? '改单(' + o.modifyCount + ')' : '改单(1)') : '';
  2073. });
  2074. // 使用 $nextTick 确保 DOM 渲染完成后再设置选中行
  2075. this.$nextTick(() => {
  2076. try {
  2077. // 检查表格引用是否存在
  2078. if (!this.$refs.mainTable) {
  2079. console.warn('[确认页面行选择持久化] 表格引用不存在,跳过设置选中行');
  2080. return;
  2081. }
  2082. // 尝试恢复之前选中的行
  2083. const restoredRow = this.restoreSelectedRow();
  2084. if (restoredRow) {
  2085. this.$refs.mainTable.setCurrentRow(restoredRow);
  2086. this.changeData(restoredRow);
  2087. } else {
  2088. // 如果没有之前选中的行,默认选中第一行
  2089. this.$refs.mainTable.setCurrentRow(this.dataList[0]);
  2090. this.changeData(this.dataList[0]);
  2091. }
  2092. } catch (error) {
  2093. console.error('[确认页面行选择持久化] 设置选中行失败:', error);
  2094. // 降级处理:只调用 changeData,不设置表格选中状态
  2095. const restoredRow = this.restoreSelectedRow();
  2096. this.changeData(restoredRow || this.dataList[0]);
  2097. }
  2098. });
  2099. }else {
  2100. this.changeData(null)
  2101. }
  2102. } else {
  2103. this.dataList = [];
  2104. }
  2105. });
  2106. },
  2107. tableRowClassName({row}) {
  2108. if (row.notifyStatus==='订单取消') {
  2109. return 'warning-row';
  2110. }
  2111. },
  2112. cellStyle({row, column }) {
  2113. if (column.property === 'notifyDate' && row.notifyDate==='发货日期不确定') { // 根据列属性判断
  2114. return { color: '#ff5d03' };
  2115. }
  2116. // 改单列显示橙色:只要modifyFlag为true就显示橙色
  2117. if (column.property === 'modifyLabel' && row.modifyFlag===true) {
  2118. return { color: '#ff5d03' };
  2119. }
  2120. return {};
  2121. },
  2122. cellStyleDetail({row, column }) {
  2123. // 只有数量列且 modifyQtyFlag=true 时才变色
  2124. if (column.property === 'qty' && row.modifyQtyFlag===true) {
  2125. return { color: '#ff5d03' };
  2126. }
  2127. // PN列保持原有的 modifyFlag 判断
  2128. if (column.property === 'pn' && row.modifyFlag===true) {
  2129. return { color: '#ff5d03' };
  2130. }
  2131. // 检查 pn 列,当 boxrolls、rollqty、boxweight 其中任意一个没有值时,将 pn 颜色改成橙色
  2132. if (column.property === 'pn') {
  2133. const hasBoxrolls = row.boxrolls !== null && row.boxrolls !== undefined && row.boxrolls !== '';
  2134. const hasRollqty = row.rollqty !== null && row.rollqty !== undefined && row.rollqty !== '';
  2135. const hasBoxweight = row.boxweight !== null && row.boxweight !== undefined && row.boxweight !== '';
  2136. const packageNo = row.packageNo !== null && row.packageNo !== undefined && row.packageNo !== '';
  2137. if (!hasBoxrolls || !hasRollqty || !hasBoxweight || !packageNo) {
  2138. return { color: '#ff8c00' }; // 橙色
  2139. }
  2140. }
  2141. return {};
  2142. },
  2143. changeData(row){
  2144. this.currentRow = JSON.parse(JSON.stringify(row));
  2145. if (this.currentRow.notifyDate==='发货日期不确定') {
  2146. this.currentRow.notifyDate=''
  2147. }
  2148. this.headerData=row;
  2149. // 保存选中行的唯一标识到本地存储
  2150. if (row && row.delNo) {
  2151. this.selectedRowKey = row.delNo;
  2152. this.saveSelectedRowToStorage();
  2153. }
  2154. this.refreshCurrentTabTable ();
  2155. },
  2156. refreshCurrentTabTable(){
  2157. if(this.currentRow===''||this.currentRow===null){
  2158. this.currentRow={site:'',delNo:'',notifyStatus:''}
  2159. }
  2160. if(this.activeName==='detail'){
  2161. searchEcssCoDelNotifyDetail(this.currentRow).then(({data}) => {
  2162. //区分请求成功和失败的状况
  2163. if (data && data.code == 0) {
  2164. this.dataList2 = data.rows
  2165. } else {
  2166. this.dataList2 = [];
  2167. }
  2168. });
  2169. }
  2170. if(this.activeName==='pallet'){
  2171. // 刷新装箱明细组件
  2172. if (this.$refs.packingDetailTab) {
  2173. this.$refs.packingDetailTab.refresh();
  2174. }
  2175. }
  2176. if(this.activeName==='box'){
  2177. searchEcssCoDelPalletHeaderData(this.currentRow).then(({data}) => {
  2178. //区分请求成功和失败的状况
  2179. if (data && data.code == 0) {
  2180. this.dataList4 = data.rows
  2181. } else {
  2182. this.dataList4 = [];
  2183. }
  2184. });
  2185. }
  2186. },
  2187. tabClick (tab, event) {
  2188. // 刷新列表数据
  2189. this.refreshCurrentTabTable()
  2190. },
  2191. confirmDo(){
  2192. confirmEcssDel(this.confirmModel).then(({data}) => {
  2193. if (data && data.code === 0) {
  2194. // 保存当前选中行的标识,以便刷新后恢复
  2195. const currentSelectedKey = this.confirmModel ? this.confirmModel.delNo : null;
  2196. if (currentSelectedKey) {
  2197. this.selectedRowKey = currentSelectedKey;
  2198. this.saveSelectedRowToStorage();
  2199. }
  2200. this.searchTable()
  2201. this.confirmModelFlag=false
  2202. this.$message({
  2203. message: '操作成功',
  2204. type: 'success',
  2205. duration: 1500,
  2206. onClose: () => {}
  2207. })
  2208. } else {
  2209. this.$alert(data.msg, '错误', {
  2210. confirmButtonText: '确定'
  2211. })
  2212. }
  2213. })
  2214. },
  2215. cancerConfirm(row){
  2216. let indata=JSON.parse(JSON.stringify(row));
  2217. if (row.notifyDate==='发货日期不确定') {
  2218. indata.notifyDate=''
  2219. }
  2220. this.$confirm('取消确认这条发货通知单?', '提示').then(() => {
  2221. cancerConfirmEcssDel(indata).then(({data}) => {
  2222. if (data && data.code === 0) {
  2223. // 保存当前选中行的标识,以便刷新后恢复
  2224. const currentSelectedKey = row ? row.delNo : null;
  2225. if (currentSelectedKey) {
  2226. this.selectedRowKey = currentSelectedKey;
  2227. this.saveSelectedRowToStorage();
  2228. }
  2229. this.searchTable()
  2230. this.$message({
  2231. message: '操作成功',
  2232. type: 'success',
  2233. duration: 1500,
  2234. onClose: () => {}
  2235. })
  2236. } else {
  2237. this.$alert(data.msg, '错误', {
  2238. confirmButtonText: '确定'
  2239. })
  2240. }
  2241. })
  2242. })
  2243. },
  2244. getBu () {
  2245. let tempData = {
  2246. username: this.$store.state.user.name,
  2247. }
  2248. getBuList(tempData).then(({data}) => {
  2249. if (data.code === 0) {
  2250. this.buList = data.row2
  2251. if (this.buList.length===1) {
  2252. this.searchData.buNo = this.buList[0].buNo;
  2253. }
  2254. }
  2255. })
  2256. },
  2257. confirmModelOpen(row){
  2258. this.confirmModel=JSON.parse(JSON.stringify(row));
  2259. this.confirmModelFlag=true
  2260. },
  2261. updateModelOpen(row){
  2262. this.confirmModel=JSON.parse(JSON.stringify(row));
  2263. if (this.confirmModel.notifyDate==='发货日期不确定') {
  2264. this.confirmModel.notifyDate=''
  2265. }
  2266. this.updateModelFlag=true
  2267. },
  2268. updateDo(){
  2269. if (!this.confirmModel.readyDate) {
  2270. this.$alert('请选择ReadyDate!', '错误', {
  2271. confirmButtonText: '确定'
  2272. })
  2273. return false
  2274. }
  2275. // 添加更新人信息
  2276. this.confirmModel.updateBy = this.$store.state.user.name
  2277. updateEcssDel(this.confirmModel).then(({data}) => {
  2278. if (data && data.code === 0) {
  2279. // 保存当前选中行的标识,以便刷新后恢复
  2280. const currentSelectedKey = this.confirmModel ? this.confirmModel.delNo : null;
  2281. if (currentSelectedKey) {
  2282. this.selectedRowKey = currentSelectedKey;
  2283. this.saveSelectedRowToStorage();
  2284. }
  2285. this.searchTable()
  2286. this.updateModelFlag=false
  2287. this.$message({
  2288. message: '操作成功',
  2289. type: 'success',
  2290. duration: 1500,
  2291. onClose: () => {}
  2292. })
  2293. } else {
  2294. this.$alert(data.msg, '错误', {
  2295. confirmButtonText: '确定'
  2296. })
  2297. }
  2298. })
  2299. },
  2300. upLoadPallet(){
  2301. if(this.currentRow.site===''||this.currentRow.site==null){
  2302. this.$alert('请先选择发货通知单!', '错误', {
  2303. confirmButtonText: '确定'
  2304. })
  2305. return false
  2306. }
  2307. let inData={
  2308. site:this.currentRow.site,
  2309. buNo:this.currentRow.buNo,
  2310. delNo:this.currentRow.delNo,
  2311. cmcInvoice:this.currentRow.cmcInvoice,
  2312. shippingMode: this.currentRow.shippingMode,
  2313. destination : this.currentRow.destination,
  2314. walMartOrderFlag:this.currentRow.walMartOrderFlag
  2315. }
  2316. this.$nextTick(() => {
  2317. this.$refs.palletUploadExcel.init(inData)
  2318. })
  2319. },
  2320. async exportExcel() {
  2321. if(this.currentRow.site===''||this.currentRow.site==null){
  2322. this.$alert('请先选择发货通知单!', '错误', {
  2323. confirmButtonText: '确定'
  2324. })
  2325. return false
  2326. }
  2327. let exportParam = {
  2328. site: this.currentRow.site,
  2329. buNo: this.currentRow.buNo,
  2330. delNo: this.currentRow.delNo,
  2331. cmcInvoice: this.currentRow.cmcInvoice,
  2332. shippingMode: this.currentRow.shippingMode,
  2333. destination : this.currentRow.destination,
  2334. readyDate: this.currentRow.readyDate, // 增加ReadyDate列
  2335. remark: this.currentRow.remark, // 增加备注列
  2336. createBy: this.$store.state.user.name,
  2337. }
  2338. try {
  2339. // 使用后台Excel模版导出
  2340. ExportUtil.export(
  2341. "/ecss/coDel/exportPackingTemplate",
  2342. exportParam,
  2343. this.currentRow.cmcInvoice + "装箱数据.xlsx"
  2344. );
  2345. // 导出成功后更新export_flag字段
  2346. let updateData = {
  2347. site: this.currentRow.site,
  2348. buNo: this.currentRow.buNo,
  2349. delNo: this.currentRow.delNo,
  2350. exportFlag: 'Y',
  2351. updateBy: this.$store.state.user.name
  2352. }
  2353. updateExportFlag(updateData).then(({data}) => {
  2354. if (data.code === 0) {
  2355. // 刷新当前行的导出状态
  2356. this.currentRow.exportFlag = 'Y';
  2357. // 刷新表格数据
  2358. this.searchTable();
  2359. this.$message({
  2360. message: '导出成功',
  2361. type: 'success',
  2362. duration: 1500
  2363. });
  2364. } else {
  2365. this.$message.warning('导出成功,但更新导出状态失败:' + data.msg);
  2366. }
  2367. }).catch(error => {
  2368. this.$message.warning('导出成功,但更新导出状态失败');
  2369. console.error('更新导出状态失败:', error);
  2370. });
  2371. } catch (error) {
  2372. this.$message.error('导出失败');
  2373. console.error('导出失败:', error);
  2374. }
  2375. },
  2376. searchPalletTable(){
  2377. this.refreshCurrentTabTable();
  2378. },
  2379. boxDetailModel(row){
  2380. this.boxDetailData=row
  2381. searchEcssCoDelPalletDetailData(row).then(({data}) => {
  2382. if (data.code === 0) {
  2383. this.dataList5 = data.rows
  2384. }
  2385. })
  2386. this.boxDetailModelFlag=true
  2387. },
  2388. updatePalletModel(row){
  2389. this.palletModelData=JSON.parse(JSON.stringify(row))
  2390. this.palletModelData.palletRemark=row.palletRemark
  2391. this.palletModelData.addFlag=1
  2392. this.palletEditFlag=true
  2393. },
  2394. newPalletModel(){
  2395. if(this.currentRow.site===''||this.currentRow.site==null){
  2396. this.$alert('请先选择发货通知单!', '错误', {
  2397. confirmButtonText: '确定'
  2398. })
  2399. return false
  2400. }
  2401. this.palletModelData={
  2402. addFlag:0,
  2403. site:this.currentRow.site,
  2404. buNo:this.currentRow.buNo,
  2405. delNo:this.currentRow.delNo,
  2406. grossWeight:'',
  2407. netWeight:'',
  2408. boxQty:'',
  2409. }
  2410. searchEcssCoDelNotifyDetail(this.currentRow).then(({data}) => {
  2411. if (data && data.code == 0) {
  2412. this.dataList8 = data.rows
  2413. } else {
  2414. this.dataList8 = [];
  2415. }
  2416. });
  2417. this.palletModelFlag=true
  2418. },
  2419. fillUseQty(row) {
  2420. row.useQty = row.surplusQty || 0;
  2421. // 全数装箱后也需要计算rolls
  2422. this.calculateRolls(row);
  2423. },
  2424. /**
  2425. * 根据装箱数量自动计算Rolls卷数
  2426. * 计算公式Rolls = 装箱数量 / 每卷数量
  2427. * @param row 当前行数据
  2428. */
  2429. calculateRolls(row) {
  2430. // 如果装箱数量为空或为0,清空rolls
  2431. if (!row.useQty || row.useQty <= 0) {
  2432. this.$set(row, 'rolls', null);
  2433. // 装箱数量变化后,重新计算总箱数和重量
  2434. this.calculateTotalBoxQtyAndWeights();
  2435. return;
  2436. }
  2437. // 如果已经有缓存的每卷数量,直接计算
  2438. if (row.rollQtyCache && row.rollQtyCache > 0) {
  2439. const rolls = row.useQty / row.rollQtyCache;
  2440. this.$set(row, 'rolls', parseFloat(rolls.toFixed(4)));
  2441. // 装箱数量变化后,重新计算总箱数和重量
  2442. this.calculateTotalBoxQtyAndWeights();
  2443. return;
  2444. }
  2445. // 调用后端API获取每卷数量
  2446. const params = {
  2447. site: this.currentRow.site,
  2448. buNo: this.currentRow.buNo,
  2449. partNo: row.partNo
  2450. };
  2451. getPartPackageProperties(params).then(({data}) => {
  2452. if (data && data.code === 0 && data.data) {
  2453. const rollQty = data.data.rollQty;
  2454. if (rollQty && rollQty > 0) {
  2455. // 缓存每卷数量到row中,避免重复请求
  2456. this.$set(row, 'rollQtyCache', rollQty);
  2457. this.$set(row, 'boxRollsCache', data.data.boxRolls);
  2458. this.$set(row, 'boxWeightCache', data.data.boxWeight);
  2459. // 计算rolls:装箱数量 / 每卷数量
  2460. const rolls = row.useQty / rollQty;
  2461. this.$set(row, 'rolls', parseFloat(rolls.toFixed(4)));
  2462. // 装箱数量变化后,重新计算总箱数和重量
  2463. this.calculateTotalBoxQtyAndWeights();
  2464. } else {
  2465. this.$message.warning(`物料 ${row.partNo} 未配置每卷数量(ROLLQTY)属性,无法自动计算Rolls`);
  2466. this.$set(row, 'rolls', null);
  2467. }
  2468. } else {
  2469. console.error('获取物料包装属性失败:', data ? data.msg : '未知错误');
  2470. // 失败时不阻断用户操作,允许手动输入
  2471. this.$set(row, 'rolls', null);
  2472. }
  2473. }).catch(error => {
  2474. console.error('获取物料包装属性异常:', error);
  2475. // 异常时不阻断用户操作,允许手动输入
  2476. this.$set(row, 'rolls', null);
  2477. });
  2478. },
  2479. /**
  2480. * 根据物料装箱数量自动计算总箱数毛重和净重
  2481. */
  2482. calculateTotalBoxQtyAndWeights() {
  2483. // 获取有装箱数量的物料列表
  2484. const selectedRows = this.dataList8.filter(item => item.useQty && item.useQty > 0);
  2485. if (selectedRows.length === 0) {
  2486. // 没有装箱数量时,清空
  2487. this.palletModelData.boxQty = null;
  2488. this.palletModelData.grossWeight = null;
  2489. this.palletModelData.netWeight = null;
  2490. return;
  2491. }
  2492. // 检查是否所有物料都已缓存包装属性
  2493. const allHaveCache = selectedRows.every(row =>
  2494. row.rollQtyCache && row.boxRollsCache && row.boxWeightCache
  2495. );
  2496. if (!allHaveCache) {
  2497. // 如果有物料未缓存属性,不自动计算(避免数据不完整)
  2498. return;
  2499. }
  2500. // 计算总箱数和总重量
  2501. let totalBoxQty = 0;
  2502. let totalGrossWeight = 0;
  2503. selectedRows.forEach(row => {
  2504. // 每箱EA = 每卷数量 × 每箱卷数
  2505. const eaPerBox = row.rollQtyCache * row.boxRollsCache;
  2506. // 该物料的箱数(向上取整)
  2507. const partBoxQty = Math.ceil(row.useQty / eaPerBox);
  2508. // 该物料的毛重 = 箱数 × 箱重量
  2509. const partGrossWeight = partBoxQty * row.boxWeightCache;
  2510. totalBoxQty += partBoxQty;
  2511. totalGrossWeight += partGrossWeight;
  2512. });
  2513. // 净重 = 毛重 - (箱数 / 2)
  2514. const totalNetWeight = totalGrossWeight - (totalBoxQty / 2);
  2515. // 自动填入箱数、毛重、净重
  2516. this.palletModelData.boxQty = totalBoxQty;
  2517. this.palletModelData.grossWeight = parseFloat(totalGrossWeight.toFixed(2));
  2518. this.palletModelData.netWeight = parseFloat(totalNetWeight.toFixed(2));
  2519. },
  2520. /**
  2521. * 根据箱数自动计算毛重和净重
  2522. * 计算公式来自后端代码2991-2992
  2523. * 毛重 = 箱数 × 箱重量
  2524. * 净重 = 毛重 - (箱数 / 2)
  2525. */
  2526. calculateWeightsByBoxQty() {
  2527. // 如果箱数为空或为0,清空毛重和净重
  2528. if (!this.palletModelData.boxQty || this.palletModelData.boxQty <= 0) {
  2529. this.palletModelData.grossWeight = null;
  2530. this.palletModelData.netWeight = null;
  2531. return;
  2532. }
  2533. // 获取有装箱数量的物料列表
  2534. const selectedRows = this.dataList8.filter(item => item.useQty && item.useQty > 0);
  2535. if (selectedRows.length === 0) {
  2536. // 没有选择物料时,不自动计算,允许用户手动输入
  2537. return;
  2538. }
  2539. // 检查是否所有物料都已缓存箱重量
  2540. const needFetchProperties = selectedRows.filter(row => !row.boxWeightCache);
  2541. if (needFetchProperties.length === 0) {
  2542. // 所有物料都有缓存,直接计算
  2543. this.calculateWeightsWithCache(selectedRows);
  2544. } else {
  2545. // 需要获取部分物料的属性
  2546. this.fetchBoxWeightsAndCalculate(selectedRows, needFetchProperties);
  2547. }
  2548. },
  2549. /**
  2550. * 使用缓存的箱重量计算毛重和净重
  2551. */
  2552. calculateWeightsWithCache(selectedRows) {
  2553. // 根据装箱数量计算加权平均箱重量
  2554. let totalWeight = 0;
  2555. let totalQty = 0;
  2556. selectedRows.forEach(row => {
  2557. if (row.boxWeightCache && row.boxWeightCache > 0 && row.rollQtyCache && row.rollQtyCache > 0 && row.boxRollsCache && row.boxRollsCache > 0) {
  2558. // 每箱EA = 每卷数量 × 每箱卷数
  2559. const eaPerBox = row.rollQtyCache * row.boxRollsCache;
  2560. // 该物料的箱数
  2561. const partBoxQty = Math.ceil(row.useQty / eaPerBox);
  2562. // 累计重量和箱数
  2563. totalWeight += partBoxQty * row.boxWeightCache;
  2564. totalQty += partBoxQty;
  2565. }
  2566. });
  2567. if (totalQty > 0) {
  2568. // 计算平均箱重量
  2569. const avgBoxWeight = totalWeight / totalQty;
  2570. this.calculateFinalWeights(avgBoxWeight);
  2571. } else {
  2572. // 如果无法计算平均重量,使用第一个物料的箱重量
  2573. const firstRow = selectedRows.find(row => row.boxWeightCache && row.boxWeightCache > 0);
  2574. if (firstRow) {
  2575. this.calculateFinalWeights(firstRow.boxWeightCache);
  2576. }
  2577. }
  2578. },
  2579. /**
  2580. * 获取物料箱重量并计算毛重净重
  2581. */
  2582. fetchBoxWeightsAndCalculate(selectedRows, needFetchProperties) {
  2583. // 批量获取物料属性
  2584. const promises = needFetchProperties.map(row => {
  2585. const params = {
  2586. site: this.currentRow.site,
  2587. buNo: this.currentRow.buNo,
  2588. partNo: row.partNo
  2589. };
  2590. return getPartPackageProperties(params).then(({data}) => {
  2591. if (data && data.code === 0 && data.data) {
  2592. // 缓存物料属性
  2593. this.$set(row, 'rollQtyCache', data.data.rollQty);
  2594. this.$set(row, 'boxRollsCache', data.data.boxRolls);
  2595. this.$set(row, 'boxWeightCache', data.data.boxWeight);
  2596. return true;
  2597. }
  2598. return false;
  2599. }).catch(error => {
  2600. console.error(`获取物料 ${row.partNo} 属性失败:`, error);
  2601. return false;
  2602. });
  2603. });
  2604. Promise.all(promises).then(() => {
  2605. // 所有属性获取完成后,重新计算
  2606. this.calculateWeightsWithCache(selectedRows);
  2607. });
  2608. },
  2609. /**
  2610. * 计算最终的毛重和净重
  2611. * @param avgBoxWeight 平均箱重量
  2612. */
  2613. calculateFinalWeights(avgBoxWeight) {
  2614. const boxQty = parseFloat(this.palletModelData.boxQty);
  2615. // 毛重 = 箱数 × 箱重量
  2616. const grossWeight = boxQty * avgBoxWeight;
  2617. // 净重 = 毛重 - (箱数 / 2)
  2618. const netWeight = grossWeight - (boxQty / 2);
  2619. // 保留2位小数
  2620. this.palletModelData.grossWeight = parseFloat(grossWeight.toFixed(2));
  2621. this.palletModelData.netWeight = parseFloat(netWeight.toFixed(2));
  2622. },
  2623. savePalletHeader(type) {
  2624. // 过滤出 useQty > 0 的行
  2625. const selectedRows = this.dataList8.filter(item => item.useQty && item.useQty > 0);
  2626. if (this.palletModelData.addFlag === 0 && selectedRows.length === 0) {
  2627. this.$alert('请至少输入一行装箱数量!', '错误', {
  2628. confirmButtonText: '确定'
  2629. });
  2630. return false;
  2631. }
  2632. if (this.palletModelData.grossWeight<=0||this.palletModelData.grossWeight==null) {
  2633. this.$alert('请输入毛重!', '错误', {
  2634. confirmButtonText: '确定'
  2635. });
  2636. return false;
  2637. }
  2638. if (this.palletModelData.netWeight<=0||this.palletModelData.netWeight==null) {
  2639. this.$alert('请输入净重!', '错误', {
  2640. confirmButtonText: '确定'
  2641. });
  2642. return false;
  2643. }
  2644. if (this.palletModelData.boxQty<=0||this.palletModelData.boxQty==null) {
  2645. this.$alert('请输入箱数!', '错误', {
  2646. confirmButtonText: '确定'
  2647. });
  2648. return false;
  2649. }
  2650. // 校验:装箱数量不能大于可装箱数量 (item.qty)
  2651. const invalidRow = selectedRows.find(item => item.useQty > item.surplusQty);
  2652. if (invalidRow) {
  2653. this.$alert(`PN ${invalidRow.pn} 的装箱数量不能大于可装箱数量(${invalidRow.surplusQty})!`, '错误', {
  2654. confirmButtonText: '确定'
  2655. });
  2656. return false;
  2657. }
  2658. this.palletModelData.walMartOrderFlag = this.currentRow.walMartOrderFlag;
  2659. this.palletModelData.notifyDetailList = selectedRows;
  2660. savePalletHeader(this.palletModelData).then(({ data }) => {
  2661. if (data && data.code === 0) {
  2662. if (type===0) {
  2663. this.palletModelData={
  2664. addFlag:0,
  2665. site:this.currentRow.site,
  2666. buNo:this.currentRow.buNo,
  2667. delNo:this.currentRow.delNo,
  2668. grossWeight:'',
  2669. netWeight:'',
  2670. boxQty:'',
  2671. }
  2672. searchEcssCoDelNotifyDetail(this.currentRow).then(({data}) => {
  2673. if (data && data.code == 0) {
  2674. this.dataList8 = data.rows
  2675. } else {
  2676. this.dataList8 = [];
  2677. }
  2678. });
  2679. } else {
  2680. this.refreshCurrentTabTable()
  2681. this.palletModelFlag=false;
  2682. }
  2683. this.$message({
  2684. message: '操作成功',
  2685. type: 'success',
  2686. duration: 1500
  2687. });
  2688. } else {
  2689. this.$alert(data.msg, '错误', {
  2690. confirmButtonText: '确定'
  2691. });
  2692. }
  2693. });
  2694. },
  2695. updateCodelPalletHeaderPalletQty(row){
  2696. // 显示页面loading
  2697. const loading = this.$loading({
  2698. lock: true,
  2699. text: '保存中...',
  2700. spinner: 'el-icon-loading',
  2701. background: 'rgba(0, 0, 0, 0.3)'
  2702. });
  2703. updateCodelPalletHeaderPalletQty(this.palletModelData).then(({data}) => {
  2704. loading.close();
  2705. if (data && data.code === 0) {
  2706. this.palletEditFlag = false
  2707. // 刷新当前tab表格
  2708. this.refreshCurrentTabTable()
  2709. // 刷新上方的发货通知单列表
  2710. this.searchTable()
  2711. this.$message({
  2712. message: '操作成功',
  2713. type: 'success',
  2714. duration: 1500,
  2715. onClose: () => {}
  2716. })
  2717. } else {
  2718. this.$alert(data.msg, '错误', {
  2719. confirmButtonText: '确定'
  2720. })
  2721. }
  2722. }).catch(error => {
  2723. loading.close();
  2724. this.$message.error('保存失败: ' + (error.message || '未知错误'))
  2725. })
  2726. },
  2727. deletePallet(row){
  2728. this.$confirm('确认删除此明细?', '提示').then(() => {
  2729. // 显示页面loading
  2730. const loading = this.$loading({
  2731. lock: true,
  2732. text: '删除中...',
  2733. spinner: 'el-icon-loading',
  2734. background: 'rgba(0, 0, 0, 0.3)'
  2735. });
  2736. deletePalletHeader(row).then(({data}) => {
  2737. loading.close();
  2738. if (data && data.code === 0) {
  2739. this.refreshCurrentTabTable()
  2740. // 刷新上方的发货通知单列表
  2741. this.searchTable()
  2742. this.$message({
  2743. message: '操作成功',
  2744. type: 'success',
  2745. duration: 1500,
  2746. onClose: () => {}
  2747. })
  2748. } else {
  2749. this.$alert(data.msg, '错误', {
  2750. confirmButtonText: '确定'
  2751. })
  2752. }
  2753. }).catch(error => {
  2754. loading.close();
  2755. this.$message.error('删除失败: ' + (error.message || '未知错误'))
  2756. })
  2757. })
  2758. },
  2759. updateBoxModel(row,type){
  2760. this.boxModelData=JSON.parse(JSON.stringify(row))
  2761. this.boxModelData.addFlag=1
  2762. this.boxModelData.type=type
  2763. this.boxModelFlag=true
  2764. },
  2765. newBoxModel(){
  2766. this.boxModelData={
  2767. addFlag:0,
  2768. site:this.boxDetailData.site,
  2769. buNo:this.boxDetailData.buNo,
  2770. delNo:this.boxDetailData.delNo,
  2771. seqNo:this.boxDetailData.seqNo,
  2772. itemNo:'',
  2773. partNo:'',
  2774. pn:'',
  2775. qty:'',
  2776. poNo:'',
  2777. boxQty:'',
  2778. rolls:'',
  2779. type:0
  2780. }
  2781. this.boxModelFlag=true
  2782. },
  2783. saveBoxHeader(){
  2784. if(this.boxModelData.partNo===''||this.boxModelData.partNo==null){
  2785. this.$alert('请输入物料!', '错误', {
  2786. confirmButtonText: '确定'
  2787. })
  2788. return false
  2789. }
  2790. if(this.boxModelData.qty<=0||this.boxModelData.qty==null){
  2791. this.$alert('请输入数量!', '错误', {
  2792. confirmButtonText: '确定'
  2793. })
  2794. return false
  2795. }
  2796. savePalletDetail(this.boxModelData).then(({data}) => {
  2797. if (data && data.code === 0) {
  2798. searchEcssCoDelPalletDetailData(this.boxDetailData).then(({data}) => {
  2799. if (data.code === 0) {
  2800. this.dataList5 = data.rows
  2801. }
  2802. })
  2803. searchCoDelPalletDataNew(this.currentRow).then(({data}) => {
  2804. if (data && data.code == 0) {
  2805. this.dataList3 = data.rows
  2806. } else {
  2807. this.dataList3 = [];
  2808. }
  2809. });
  2810. this.boxModelFlag=false;
  2811. this.$message({
  2812. message: '操作成功',
  2813. type: 'success',
  2814. duration: 1500,
  2815. onClose: () => {}
  2816. })
  2817. } else {
  2818. this.$alert(data.msg, '错误', {
  2819. confirmButtonText: '确定'
  2820. })
  2821. }
  2822. })
  2823. },
  2824. oneClickPacking(){
  2825. if(this.currentRow.site===''||this.currentRow.site==null){
  2826. this.$alert('请先选择发货通知单!', '错误', {
  2827. confirmButtonText: '确定'
  2828. })
  2829. return false
  2830. }
  2831. this.oneClickPackingModelData={
  2832. boxRemnant: false,
  2833. }
  2834. this.oneClickPackingModelFlag=true
  2835. },
  2836. saveOneClickPacking(){
  2837. let saveData = {
  2838. site: this.currentRow.site,
  2839. buNo: this.currentRow.buNo,
  2840. delNo: this.currentRow.delNo,
  2841. boxRemnant: this.oneClickPackingModelData.boxRemnant,
  2842. }
  2843. // 显示页面loading
  2844. const loading = this.$loading({
  2845. lock: true,
  2846. text: '一键装箱计算中...',
  2847. spinner: 'el-icon-loading',
  2848. background: 'rgba(0, 0, 0, 0.3)'
  2849. });
  2850. saveOneClickPacking(saveData).then(({data}) => {
  2851. loading.close();
  2852. if (data && data.code === 0) {
  2853. this.oneClickPackingModelFlag=false;
  2854. // 刷新当前tab表格
  2855. this.refreshCurrentTabTable()
  2856. // 刷新上方的发货通知单列表
  2857. this.searchTable()
  2858. this.$message({
  2859. message: '操作成功',
  2860. type: 'success',
  2861. duration: 1500,
  2862. onClose: () => {}
  2863. })
  2864. } else {
  2865. this.$alert(data.msg, '错误', {
  2866. confirmButtonText: '确定'
  2867. })
  2868. }
  2869. }).catch(error => {
  2870. loading.close();
  2871. this.$message.error('一键装箱失败: ' + (error.message || '未知错误'))
  2872. })
  2873. },
  2874. openPalletDialog () {
  2875. //请求
  2876. this.searchPalletList();
  2877. },
  2878. closePalletDialog () {
  2879. this.palletList = []
  2880. this.palletFlag = false
  2881. },
  2882. searchPalletList () {
  2883. this.palletData.buNo = this.palletModelData.buNo
  2884. searchPalletList(this.palletData).then(({data}) => {
  2885. if (data && data.code === 0){
  2886. this.palletList = data.rows;
  2887. }
  2888. })
  2889. },
  2890. palletRowDblclick (row) {
  2891. this.palletModelData.pallet = row.palletNo
  2892. this.palletFlag = false
  2893. },
  2894. // 栈板维护相关方法
  2895. palletMaintenance() {
  2896. if(this.currentRow.site===''||this.currentRow.site==null){
  2897. this.$alert('请先选择发货通知单!', '错误', {
  2898. confirmButtonText: '确定'
  2899. })
  2900. return false
  2901. }
  2902. // 重置栈板记录
  2903. this.palletMaintenanceRecords = []
  2904. // 默认根据buNo获取全部栈板
  2905. this.loadAllPalletsForMaintenance()
  2906. this.palletMaintenanceModelFlag = true
  2907. },
  2908. // 根据buNo加载全部栈板用于维护
  2909. loadAllPalletsForMaintenance() {
  2910. let searchData = {
  2911. palletType: '', // 不限制栈板类型,获取全部
  2912. buNo: this.currentRow.buNo
  2913. }
  2914. searchPalletList(searchData).then(({data}) => {
  2915. if (data.code === 0) {
  2916. const pallets = data.rows || []
  2917. // 为每个栈板创建一条记录
  2918. this.palletMaintenanceRecords = pallets.map(pallet => ({
  2919. pallet: pallet.palletNo,
  2920. palletType: pallet.palletType,
  2921. palletQty: '', // 默认为空,用户需要输入
  2922. height: '' // 使用栈板的默认高度
  2923. }))
  2924. }
  2925. }).catch(error => {
  2926. console.error('加载栈板列表失败:', error)
  2927. // 如果加载失败,至少添加一行空记录
  2928. this.palletMaintenanceRecords = [{
  2929. pallet: '',
  2930. palletType: '',
  2931. palletQty: '',
  2932. height: ''
  2933. }]
  2934. })
  2935. },
  2936. savePalletMaintenance() {
  2937. // 过滤出托数大于0的栈板记录
  2938. const validPalletRecords = this.palletMaintenanceRecords.filter(record => {
  2939. return record.palletQty && parseFloat(record.palletQty) > 0
  2940. })
  2941. if (validPalletRecords.length === 0) {
  2942. this.$alert('请至少输入一条有效的栈板记录!', '错误', {
  2943. confirmButtonText: '确定'
  2944. })
  2945. return false
  2946. }
  2947. // 验证有效的栈板记录
  2948. for (let i = 0; i < validPalletRecords.length; i++) {
  2949. const record = validPalletRecords[i]
  2950. if (!record.pallet) {
  2951. this.$alert(`栈板不能为空!`, '错误', {
  2952. confirmButtonText: '确定'
  2953. })
  2954. return false
  2955. }
  2956. if (!record.height || record.height <= 0) {
  2957. this.$alert(`栈板高度必须大于0!`, '错误', {
  2958. confirmButtonText: '确定'
  2959. })
  2960. return false
  2961. }
  2962. }
  2963. // 这里只新增栈板记录,不做其他事情
  2964. let saveData = {
  2965. site: this.currentRow.site,
  2966. buNo: this.currentRow.buNo,
  2967. delNo: this.currentRow.delNo,
  2968. palletRecords: JSON.stringify(validPalletRecords),
  2969. }
  2970. // 使用相同的API,但传递maintenanceOnly标识
  2971. savePalletMaintenance(saveData).then(({data}) => {
  2972. if (data && data.code === 0) {
  2973. this.refreshCurrentTabTable()
  2974. this.palletMaintenanceModelFlag = false;
  2975. this.$message({
  2976. message: '栈板记录新增成功',
  2977. type: 'success',
  2978. duration: 1500,
  2979. onClose: () => {}
  2980. })
  2981. } else {
  2982. this.$alert(data.msg, '错误', {
  2983. confirmButtonText: '确定'
  2984. })
  2985. }
  2986. })
  2987. },
  2988. getSummaries(param) {
  2989. const { columns } = param;
  2990. const sums = [];
  2991. columns.forEach((column, index) => {
  2992. if (index === 0) {
  2993. sums[index] = '合计';
  2994. return;
  2995. }
  2996. let sumDataList = this.dataList4.filter(item => item.palletQty>0);
  2997. const values = sumDataList.map(item => Number(item[column.property]));
  2998. if (!values.every(value => isNaN(value))) {
  2999. switch(column.property) {
  3000. case 'palletQty':
  3001. sums[index] = `${values.reduce((a, b) => a + b, 0)}`;
  3002. break;
  3003. case 'weight':
  3004. sums[index] = `${values.reduce((a, b) => a + b, 0)}`;
  3005. break;
  3006. default:
  3007. sums[index] = '';
  3008. }
  3009. } else {
  3010. sums[index] = '';
  3011. }
  3012. });
  3013. this.$nextTick(() => this.$refs.detailTable.doLayout());// 强制刷新布局, 否则会被表格覆盖
  3014. return sums;
  3015. },
  3016. getDetailSummaries(param) {
  3017. const { columns } = param;
  3018. const sums = [];
  3019. columns.forEach((column, index) => {
  3020. if (index === 0) {
  3021. sums[index] = '合计';
  3022. return;
  3023. }
  3024. let sumDataList = this.dataList2.filter(item => item.qty>0);
  3025. const values = sumDataList.map(item => Number(item[column.property]));
  3026. if (!values.every(value => isNaN(value))) {
  3027. switch(column.property) {
  3028. case 'qty':
  3029. sums[index] = `${values.reduce((a, b) => a + b, 0)}`;
  3030. break;
  3031. case 'ttlAmount':
  3032. sums[index] = `${values.reduce((a, b) => a + b, 0).toFixed(2)}`;
  3033. break;
  3034. case 'sumPrice':
  3035. sums[index] = `${values.reduce((a, b) => a + b, 0).toFixed(2)}`;
  3036. break;
  3037. default:
  3038. sums[index] = '';
  3039. }
  3040. } else {
  3041. sums[index] = '';
  3042. }
  3043. });
  3044. this.$nextTick(() => this.$refs.cloDetailTable.doLayout());// 强制刷新布局, 否则会被表格覆盖
  3045. return sums;
  3046. },
  3047. /**
  3048. * 保存选中行到本地存储
  3049. * 使用页面路径和用户名作为存储键的一部分确保不同页面和用户的选择互不影响
  3050. */
  3051. saveSelectedRowToStorage() {
  3052. try {
  3053. const storageKey = `codelnotifyConfirm_selected_row_${this.$store.state.user.name}`;
  3054. localStorage.setItem(storageKey, this.selectedRowKey);
  3055. console.log(`[确认页面行选择持久化] 已保存选中行: ${this.selectedRowKey}`);
  3056. } catch (error) {
  3057. console.warn('保存选中行状态失败:', error);
  3058. }
  3059. },
  3060. /**
  3061. * 从本地存储恢复选中行
  3062. * @returns {Object|null} 返回匹配的行数据如果没有找到则返回null
  3063. */
  3064. restoreSelectedRow() {
  3065. try {
  3066. const storageKey = `codelnotifyConfirm_selected_row_${this.$store.state.user.name}`;
  3067. const savedRowKey = localStorage.getItem(storageKey);
  3068. // 检查必要的条件
  3069. if (!savedRowKey) {
  3070. console.log('[确认页面行选择持久化] 没有保存的选中行');
  3071. return null;
  3072. }
  3073. if (!this.dataList || this.dataList.length === 0) {
  3074. console.log('[确认页面行选择持久化] 数据列表为空,无法恢复选中行');
  3075. return null;
  3076. }
  3077. // 在当前数据列表中查找匹配的行
  3078. const matchedRow = this.dataList.find(row => row && row.delNo === savedRowKey);
  3079. if (matchedRow) {
  3080. this.selectedRowKey = savedRowKey;
  3081. console.log(`[确认页面行选择持久化] 已恢复选中行: ${savedRowKey}`);
  3082. return matchedRow;
  3083. } else {
  3084. console.log(`[确认页面行选择持久化] 未找到匹配的行: ${savedRowKey},当前数据列表长度: ${this.dataList.length}`);
  3085. }
  3086. return null;
  3087. } catch (error) {
  3088. console.warn('恢复选中行状态失败:', error);
  3089. return null;
  3090. }
  3091. },
  3092. /**
  3093. * 清除本地存储的选中行状态
  3094. */
  3095. clearSelectedRowStorage() {
  3096. try {
  3097. const storageKey = `codelnotifyConfirm_selected_row_${this.$store.state.user.name}`;
  3098. localStorage.removeItem(storageKey);
  3099. this.selectedRowKey = null;
  3100. } catch (error) {
  3101. console.warn('清除选中行状态失败:', error);
  3102. }
  3103. },
  3104. },
  3105. activated() {
  3106. this.searchTable()
  3107. },
  3108. created() {
  3109. this.getBu ()
  3110. // 动态列
  3111. this.getTableUserColumn(this.$route.meta.menuId+'table1',1)
  3112. // 初始化时从本地存储加载选中行状态
  3113. try {
  3114. const storageKey = `codelnotifyConfirm_selected_row_${this.$store.state.user.name}`;
  3115. const savedRowKey = localStorage.getItem(storageKey);
  3116. if (savedRowKey) {
  3117. this.selectedRowKey = savedRowKey;
  3118. }
  3119. } catch (error) {
  3120. console.warn('初始化选中行状态失败:', error);
  3121. }
  3122. }
  3123. }
  3124. </script>
  3125. <style lang="scss">
  3126. .warning-row td{
  3127. color: darkred !important;
  3128. }
  3129. .zxClass .cell {
  3130. line-height: 24px;
  3131. font-size: 12px;
  3132. height: 24px;
  3133. }
  3134. /* 可点击的PN样式 */
  3135. .clickable-pn {
  3136. cursor: pointer;
  3137. text-decoration: underline;
  3138. }
  3139. .clickable-pn:hover {
  3140. opacity: 0.8;
  3141. }
  3142. /* 对话框标题样式 */
  3143. .dialog-title {
  3144. display: flex;
  3145. align-items: center;
  3146. font-size: 16px;
  3147. font-weight: 500;
  3148. }
  3149. .dialog-title .el-icon-question:hover {
  3150. color: #66b1ff;
  3151. transform: scale(1.1);
  3152. transition: all 0.3s ease;
  3153. }
  3154. /* 表格头部提示图标样式 */
  3155. /deep/ .el-table th .el-icon-question:hover {
  3156. color: #409EFF;
  3157. transform: scale(1.1);
  3158. transition: all 0.2s ease;
  3159. }
  3160. /* 提示框内容样式 */
  3161. /deep/ .el-tooltip__popper {
  3162. max-width: 300px;
  3163. }
  3164. /deep/ .el-tooltip__popper .el-tooltip__content {
  3165. line-height: 1.6;
  3166. }
  3167. /deep/ .el-tooltip__popper .el-tooltip__content div {
  3168. margin-bottom: 4px;
  3169. }
  3170. /deep/ .el-tooltip__popper .el-tooltip__content div:first-child {
  3171. font-weight: bold;
  3172. margin-bottom: 8px;
  3173. color: #409EFF;
  3174. }
  3175. .pallet-dialog .section {
  3176. margin: 10px 7px;
  3177. }
  3178. .section-title {
  3179. font-size: 14px;
  3180. font-weight: bold;
  3181. color: #333;
  3182. margin-bottom: 8px;
  3183. }
  3184. .table-wrapper {
  3185. height: 300px; /* 让表格部分固定高度并滚动 */
  3186. overflow-y: auto;
  3187. }
  3188. </style>