plm前端
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.

5064 lines
227 KiB

  1. <template>
  2. <div class="mod-config">
  3. <!-- 查询条件 -->
  4. <el-form :inline="true" label-position="top" :model="searchData">
  5. <el-form-item label="序列号">
  6. <el-input v-model="searchData.referenceNo" clearable style="width: 120px"></el-input>
  7. </el-form-item>
  8. <el-form-item label="单据状态">
  9. <el-select v-model="searchData.status" clearable style="width: 120px">
  10. <el-option label="草稿" value="草稿"></el-option>
  11. <el-option label="审批中" value="审批中"></el-option>
  12. <el-option label="已完成" value="已完成"></el-option>
  13. </el-select>
  14. </el-form-item>
  15. <el-form-item label="RoHS状态">
  16. <el-select v-model="searchData.rohsStatus" clearable style="width: 120px">
  17. <el-option label="Active" value="Active"></el-option>
  18. <el-option label="Dead" value="Dead"></el-option>
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="节点审批人">
  22. <el-input v-model="searchData.currentApprover" clearable style="width: 120px"></el-input>
  23. </el-form-item>
  24. <el-form-item label="当前节点">
  25. <el-select v-model="searchData.nodeId" placeholder="请选择节点" clearable style="width: 120px">
  26. <el-option
  27. v-for="option in nodeOptions"
  28. :key="option.id"
  29. :label="option.name"
  30. :value="option.id">
  31. </el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item :label="' '">
  35. <el-button v-if="authSearch" @click="getDataList">查询</el-button>
  36. <el-button v-if="authUpdate" @click="addOrUpdateHandle()">新增</el-button>
  37. <el-button v-if="authDelete" type="danger" @click="deleteHandle()">删除</el-button>
  38. <download-excel
  39. v-if="authSearch"
  40. :fields="exportFieldMap"
  41. :data="exportData"
  42. type="xls"
  43. :name="exportName"
  44. :header="exportHeader"
  45. :footer="exportFooter"
  46. :fetch="createExportData"
  47. :before-generate="startDownload"
  48. :before-finish="finishDownload"
  49. worksheet="导出信息"
  50. :class="['el-button', 'el-button--primary', 'el-button--medium', {'is-loading': exportLoading}]">
  51. <i v-if="exportLoading" class="el-icon-loading"></i>
  52. <span>{{ "导出" }}</span>
  53. </download-excel>
  54. <el-button v-if="authSearch" @click="searchHandle()">搜索</el-button>
  55. </el-form-item>
  56. </el-form>
  57. <!-- 列表 -->
  58. <el-table
  59. ref="rohsTable"
  60. :height="height"
  61. :data="dataList"
  62. border
  63. :row-style="rowStyle"
  64. @row-click="changeClickRow"
  65. @current-change="currentChange"
  66. @selection-change="dataListSelectionChange"
  67. v-loading="dataListLoading"
  68. style="width: 100%;">
  69. <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
  70. <el-table-column prop="referenceNo" header-align="center" align="center" label="序列号" width="165"></el-table-column>
  71. <el-table-column prop="status" header-align="center" align="center" label="单据状态" width="120"></el-table-column>
  72. <el-table-column prop="nodeId" header-align="center" align="center" label="当前节点ID" width="130"></el-table-column>
  73. <el-table-column prop="nodeName" header-align="center" align="center" label="当前节点" width="150"></el-table-column>
  74. <el-table-column prop="currentApprover" header-align="center" align="center" label="当前节点审批人" width="170"></el-table-column>
  75. <el-table-column prop="applicant" header-align="center" align="center" label="申请人编码" width="130"></el-table-column>
  76. <el-table-column prop="applicantName" header-align="center" align="center" label="申请人名称" width="150"></el-table-column>
  77. <el-table-column prop="pm" header-align="center" align="center" label="PM编码" width="130"></el-table-column>
  78. <el-table-column prop="pmName" header-align="center" align="center" label="PM名称" width="150"></el-table-column>
  79. <el-table-column prop="applicationDate" header-align="center" align="center" label="申请日期" width="165"></el-table-column>
  80. <el-table-column prop="plannedMassProductionDate" header-align="center" align="center" label="计划转量产时间" width="165">
  81. <template slot-scope="scope">
  82. <span>{{ normalizeDateOnly(scope.row.plannedMassProductionDate) }}</span>
  83. </template>
  84. </el-table-column>
  85. <el-table-column prop="process" header-align="center" align="center" label="工艺" width="120"></el-table-column>
  86. <el-table-column prop="color" header-align="center" align="center" label="颜色" width="120"></el-table-column>
  87. <el-table-column prop="vendorCode" header-align="center" align="center" label="供应商" width="160"></el-table-column>
  88. <el-table-column prop="vendorMaterialCode" header-align="center" align="center" label="供应商材料编码" width="200" :show-overflow-tooltip="true"></el-table-column>
  89. <el-table-column prop="materialClassify" header-align="center" align="center" label="材料分类" width="200" :show-overflow-tooltip="true"></el-table-column>
  90. <el-table-column prop="otherMaterialClassify" header-align="center" align="center" label="其他材料分类" width="210" :show-overflow-tooltip="true"></el-table-column>
  91. <el-table-column prop="materialUseFor" header-align="center" align="center" label="辅材用途" width="180" :show-overflow-tooltip="true"></el-table-column>
  92. <el-table-column prop="endCustomer" header-align="center" align="center" label="最终客户编码" width="160"></el-table-column>
  93. <el-table-column prop="endCustomerName" header-align="center" align="center" label="最终客户名称" width="180"></el-table-column>
  94. <el-table-column prop="projectId" header-align="center" align="center" label="项目编码" width="140"></el-table-column>
  95. <el-table-column prop="projectName" header-align="center" align="center" label="项目名称" width="180"></el-table-column>
  96. <el-table-column prop="commGroup1" header-align="center" align="center" label="商品组1编码" width="170"></el-table-column>
  97. <el-table-column prop="commGroup1Desc" header-align="center" align="center" label="商品组1名称" width="170"></el-table-column>
  98. <el-table-column prop="commGroup2" header-align="center" align="center" label="商品组2编码" width="170"></el-table-column>
  99. <el-table-column prop="commGroup2Desc" header-align="center" align="center" label="商品组2名称" width="170"></el-table-column>
  100. <el-table-column prop="commGroup3" header-align="center" align="center" label="商品组3编码" width="170"></el-table-column>
  101. <el-table-column prop="commGroup3Desc" header-align="center" align="center" label="商品组3名称" width="170"></el-table-column>
  102. <el-table-column prop="needCreateNumber" header-align="center" align="center" label="需创建内部编号" width="200"></el-table-column>
  103. <el-table-column prop="npdEngineer" header-align="center" align="center" label="NPD工程师编码" width="170"></el-table-column>
  104. <el-table-column prop="npdEngineerName" header-align="center" align="center" label="NPD工程师名称" width="170"></el-table-column>
  105. <el-table-column prop="materialValidityTime" header-align="center" align="center" label="材料有效期" width="200"></el-table-column>
  106. <el-table-column prop="needDeviation" header-align="center" align="center" label="是否需偏差许可" width="190"></el-table-column>
  107. <el-table-column prop="technicalPlan" header-align="center" align="center" label="技术计划编码" width="170"></el-table-column>
  108. <el-table-column prop="technicalPlanName" header-align="center" align="center" label="技术计划名称" width="170"></el-table-column>
  109. <el-table-column prop="buyer" header-align="center" align="center" label="采购编码" width="130"></el-table-column>
  110. <el-table-column prop="buyerName" header-align="center" align="center" label="采购名称" width="130"></el-table-column>
  111. <el-table-column prop="expectReportTime" header-align="center" align="center" label="预计提供报告时间(一个月内)" width="200">
  112. <template slot-scope="scope">
  113. <span>{{ normalizeDateOnly(scope.row.expectReportTime) }}</span>
  114. </template>
  115. </el-table-column>
  116. <el-table-column prop="rohsStatus" header-align="center" align="center" label="RoHS状态" width="130"></el-table-column>
  117. <el-table-column prop="expiredDate" header-align="center" align="center" label="报告日期" width="165"></el-table-column>
  118. <el-table-column prop="validUntilDisplay" header-align="center" align="center" label="有效期" width="170" :show-overflow-tooltip="true">
  119. <template slot-scope="scope">
  120. <span>{{ getValidUntilDisplay(scope.row.validUntilValue, scope.row.validUntil) }}</span>
  121. </template>
  122. </el-table-column>
  123. <el-table-column prop="isMeetRohsRequirement" header-align="center" align="center" label="符合RoHS" width="170"></el-table-column>
  124. <el-table-column prop="isAhGrade" header-align="center" align="center" label="AH属性" width="140"></el-table-column>
  125. <el-table-column prop="hsfSupplierClassification" header-align="center" align="center" label="HSF供应商等级" width="220"></el-table-column>
  126. <el-table-column prop="hsfApproverName" header-align="center" align="center" label="HSF审批人" width="240" :show-overflow-tooltip="true">
  127. <template slot-scope="scope">
  128. <span>{{ scope.row.hsfApproverName || scope.row.hsfApprover || '' }}</span>
  129. </template>
  130. </el-table-column>
  131. <el-table-column prop="relatedPeopleName" header-align="center" align="center" label="Inform Related people" width="200" :show-overflow-tooltip="true">
  132. <template slot-scope="scope">
  133. <span>{{ scope.row.relatedPeopleName || scope.row.relatedPeople || '' }}</span>
  134. </template>
  135. </el-table-column>
  136. <el-table-column prop="isSameMaterialDiffSize" header-align="center" align="center" label="同材不同规格" width="220"></el-table-column>
  137. <el-table-column prop="ifsPartNo" header-align="center" align="center" label="IFS编号" width="150"></el-table-column>
  138. <el-table-column prop="remark" header-align="center" align="center" label="备注" width="220" :show-overflow-tooltip="true"></el-table-column>
  139. <el-table-column fixed="right" header-align="center" align="center" width="130" label="操作">
  140. <template slot-scope="scope">
  141. <el-link v-if="authUpdate && scope.row.status !== '已完成'" style="cursor: pointer" @click="addOrUpdateHandle(scope.row)">编辑</el-link>
  142. <el-link v-if="authUpdate && scope.row.status === '已完成'" style="cursor: pointer" @click="addOrUpdateHandle(scope.row)">详情</el-link>
  143. <el-link v-if="authIssue && scope.row.status === '草稿'" style="cursor: pointer; margin-left: 10px;" @click="issueModal(scope.row)">下达</el-link>
  144. </template>
  145. </el-table-column>
  146. </el-table>
  147. <!-- 分页 -->
  148. <el-pagination style="margin-top: 0px"
  149. @size-change="sizeChangeHandle"
  150. @current-change="currentChangeHandle"
  151. :current-page="pageIndex"
  152. :page-sizes="[20, 50, 100, 200, 500]"
  153. :page-size="pageSize"
  154. :total="totalPage"
  155. layout="total, sizes, prev, pager, next, jumper">
  156. </el-pagination>
  157. <!-- 编辑模态框 -->
  158. <el-dialog
  159. :title="modalTitle"
  160. :visible.sync="modalFlag"
  161. width="1012px"
  162. top="3.8vh"
  163. v-drag
  164. :close-on-click-modal="false"
  165. :showClose="false">
  166. <el-tabs tab-position="left" type="border-card" v-model="activeName" style="width: 100%;height: 777px;">
  167. <!-- 基本信息 -->
  168. <el-tab-pane label="基本信息" name="basicInfo">
  169. <div style="height: 755px">
  170. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -5px;">
  171. <el-form-item>
  172. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('applicant')" slot="label" @click="getBaseList(103, 1)"><a herf="#">申请人/Reference No.</a></span>
  173. <span v-else slot="label">申请人/Reference No.</span>
  174. <el-input v-model="modalData.applicant" @blur="applicantBlur(103)" :disabled="isRohsFieldDisabled('applicant')" style="width: 100px"></el-input>
  175. <el-input v-model="modalData.applicantName" disabled style="width: 155px"></el-input>
  176. </el-form-item>
  177. <el-form-item label="申请日期/Date">
  178. <el-date-picker v-model="modalData.applicationDate" type="date" value-format="yyyy-MM-dd" :disabled="isRohsFieldDisabled('applicationDate')" style="width: 150px" :editable=false></el-date-picker>
  179. </el-form-item>
  180. <el-form-item label="Site">
  181. <el-input v-model="modalData.site" disabled style="width: 95px"></el-input>
  182. </el-form-item>
  183. <el-form-item label="工艺/Process">
  184. <dict-data-select v-model="modalData.process" clearable @change="handleProcessChange" :disabled="isProcessFieldDisabled()" style="width: 121px" dict-type="rohs_process"></dict-data-select>
  185. </el-form-item>
  186. </el-form>
  187. <el-form :inline="true" label-position="top" :model="modalData">
  188. <el-form-item>
  189. <span slot="label" v-if="!modalData.endCustomerFlag && !isRohsFieldDisabled('endCustomer')" @click="getBaseList(102, 1)"><a herf="#">最终客户/End Customer</a></span>
  190. <span slot="label" v-else>最终客户/End Customer</span>
  191. <el-input :disabled="modalData.endCustomerFlag || isRohsFieldDisabled('endCustomer')" readonly v-model="modalData.endCustomer" @blur="handleQueryCustomer" style="width: 100px"></el-input>
  192. <el-input disabled v-model="modalData.endCustomerName" style="width: 155px"></el-input>
  193. </el-form-item>
  194. <el-form-item>
  195. <span slot="label" v-if="!modalData.projectIdFlag && !isRohsFieldDisabled('projectId')" @click="chooseProjectListFlag = true"><a herf="#">项目编码/Project</a></span>
  196. <span slot="label" v-else>项目编码/Project</span>
  197. <el-input :disabled="modalData.projectIdFlag || isRohsFieldDisabled('projectId')" readonly v-model="modalData.projectId" @blur="handleQueryProjectByCustomer" style="width: 100px"></el-input>
  198. <el-input disabled v-model="modalData.projectName" style="width: 155px"></el-input>
  199. </el-form-item>
  200. <el-form-item label="WM所需求规格/The size that WM need">
  201. <el-input v-model="modalData.wmRequiredSpec" :disabled="isRohsFieldDisabled('wmRequiredSpec')" style="width: 260px"></el-input>
  202. </el-form-item>
  203. </el-form>
  204. <el-form :inline="true" label-position="top" :model="modalData">
  205. <el-form-item label="供应商/Vendor Code">
  206. <el-input v-model="modalData.vendorCode" :disabled="isRohsFieldDisabled('vendorCode')" style="width: 396px"></el-input>
  207. </el-form-item>
  208. <el-form-item label="供应商材料编码/Vendor Material Code">
  209. <el-input v-model="modalData.vendorMaterialCode" :disabled="isRohsFieldDisabled('vendorMaterialCode')" style="width: 396px"></el-input>
  210. </el-form-item>
  211. </el-form>
  212. <el-form :inline="true" label-position="top" :model="modalData">
  213. <el-form-item label="材料分类/Material Classify">
  214. <dict-data-select class="rohs-multiple-two-rows" v-model="modalData.materialClassifyList" multiple :title="getMultipleSelectTitle(modalData.materialClassifyList)" :disabled="isRohsFieldDisabled('materialClassify')" style="width: 532px" dict-type="rohs_material_classify"></dict-data-select>
  215. </el-form-item>
  216. <el-form-item label="其他分类/Other Material Classify" v-if="modalData.materialClassifyList && modalData.materialClassifyList.includes('Other其他')">
  217. <el-input v-model="modalData.otherMaterialClassify" :disabled="isRohsFieldDisabled('otherMaterialClassify')" style="width: 260px"></el-input>
  218. </el-form-item>
  219. </el-form>
  220. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 40px">
  221. <el-form-item label="辅材用途/Assiaccessorial Material Use for">
  222. <el-input v-model="modalData.materialUseFor" :disabled="isRohsFieldDisabled('materialUseFor')" style="width: 259px"></el-input>
  223. </el-form-item>
  224. <el-form-item>
  225. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('technicalPlan')" slot="label" @click="getBaseList(2001, 4)"><a herf="#">技术计划/TP</a></span>
  226. <span v-else slot="label">技术计划/TP</span>
  227. <el-input v-model="modalData.technicalPlan" @blur="technicalPlanBlur(2001)" :disabled="isRohsFieldDisabled('technicalPlan')" style="width: 100px"></el-input>
  228. <el-input v-model="modalData.technicalPlanName" disabled style="width: 155px"></el-input>
  229. </el-form-item>
  230. <el-form-item>
  231. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('pm')" slot="label" @click="getBaseList(2054, 5)"><a herf="#">PM人员/PM</a></span>
  232. <span v-else slot="label">PM人员/PM</span>
  233. <el-input v-model="modalData.pm" @blur="pmBlur(2054)" :disabled="isRohsFieldDisabled('pm')" style="width: 100px"></el-input>
  234. <el-input v-model="modalData.pmName" disabled style="width: 156px"></el-input>
  235. </el-form-item>
  236. </el-form>
  237. <el-form :inline="true" label-position="top" :model="modalData">
  238. <el-form-item label="颜色/Color">
  239. <el-input v-model="modalData.color" :disabled="isRohsFieldDisabled('color')" style="width: 532px"></el-input>
  240. </el-form-item>
  241. <el-form-item label="计划转量产时间/Planned Mass Production Date">
  242. <el-date-picker v-model="modalData.plannedMassProductionDate" type="date" value-format="yyyy-MM-dd" :disabled="isRohsFieldDisabled('plannedMassProductionDate')" style="width: 260px" :editable=false></el-date-picker>
  243. </el-form-item>
  244. </el-form>
  245. <el-form :inline="true" label-position="top" :model="modalData">
  246. <el-form-item>
  247. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('commGroup1')" slot="label" @click="getBaseList(110)"><a herf="#">商品组1/Comm Group 1</a></span>
  248. <span v-else slot="label">商品组1/Comm Group 1</span>
  249. <el-input v-model="modalData.commGroup1" @change="commGroup1Blur(110)" :disabled="isRohsFieldDisabled('commGroup1')" style="width: 100px"></el-input>
  250. <el-input v-model="modalData.commGroup1Desc" disabled style="width: 155px"></el-input>
  251. </el-form-item>
  252. <el-form-item>
  253. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('commGroup2')" slot="label" @click="getBaseList(111)"><a herf="#">商品组2/Comm Group 2</a></span>
  254. <span v-else slot="label">商品组2/Comm Group 2</span>
  255. <el-input v-model="modalData.commGroup2" @change="commGroup2Blur(111)" :disabled="isRohsFieldDisabled('commGroup2')" style="width: 100px"></el-input>
  256. <el-input v-model="modalData.commGroup2Desc" disabled style="width: 155px"></el-input>
  257. </el-form-item>
  258. <el-form-item>
  259. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('commGroup3')" slot="label" @click="getBaseList(130)"><a herf="#">商品组3/Comm Group 3</a></span>
  260. <span v-else slot="label">商品组3/Comm Group 3</span>
  261. <el-input v-model="modalData.commGroup3" @change="commGroup3Blur(130)" :disabled="isRohsFieldDisabled('commGroup3')" style="width: 100px"></el-input>
  262. <el-input v-model="modalData.commGroup3Desc" disabled style="width: 156px"></el-input>
  263. </el-form-item>
  264. </el-form>
  265. <el-form :inline="true" label-position="top" :model="modalData">
  266. <el-form-item label="是否是Fiber材料">
  267. <el-radio-group v-model="modalData.isFiberMaterial" :disabled="isRohsFieldDisabled('isFiberMaterial')" style="width: 145px">
  268. <el-radio label="Y" @click.native.prevent="radioClick('isFiberMaterial', 'Y')"></el-radio>
  269. <el-radio label="N" @click.native.prevent="radioClick('isFiberMaterial', 'N')"></el-radio>
  270. </el-radio-group>
  271. </el-form-item>
  272. <el-form-item label="是否需要创建300/700/900号/Dose Need Create 300/700/900 Number">
  273. <el-radio-group v-model="modalData.needCreateNumber" :disabled="isRohsFieldDisabled('needCreateNumber')" style="width: 374px">
  274. <el-radio label="Y" @click.native.prevent="radioClick('needCreateNumber', 'Y')"></el-radio>
  275. <el-radio label="N" @click.native.prevent="radioClick('needCreateNumber', 'N')"></el-radio>
  276. </el-radio-group>
  277. </el-form-item>
  278. <el-form-item label="材料厚度/Material Thickness">
  279. <el-input v-model="modalData.materialThickness" :disabled="isRohsFieldDisabled('materialThickness')" style="width: 260px"></el-input>
  280. </el-form-item>
  281. </el-form>
  282. <el-form :inline="true" label-position="top" :model="modalData">
  283. <el-form-item label="材料有效期/Material Validity Time">
  284. <dict-data-select v-model="modalData.materialValidityTime" clearable :disabled="isRohsFieldDisabled('materialValidityTime')" style="width: 260px" dict-type="rohs_material_validity_time"></dict-data-select>
  285. </el-form-item>
  286. <el-form-item label="是否需要Deviation/If need deviation or not">
  287. <el-radio-group v-model="modalData.needDeviation" :disabled="isRohsFieldDisabled('needDeviation')" style="width: 259px">
  288. <el-radio label="Y" @click.native.prevent="radioClick('needDeviation', 'Y')"></el-radio>
  289. <el-radio label="N" @click.native.prevent="radioClick('needDeviation', 'N')"></el-radio>
  290. </el-radio-group>
  291. </el-form-item>
  292. <el-form-item>
  293. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('npdEngineer')" slot="label" @click="getBaseList(2001, 3)"><a herf="#">NPD工程师/NPD Engineer</a></span>
  294. <span v-else slot="label">NPD工程师/NPD Engineer</span>
  295. <el-input v-model="modalData.npdEngineer" @blur="npdEngineerBlur(2001)" :disabled="isRohsFieldDisabled('npdEngineer')" style="width: 100px"></el-input>
  296. <el-input v-model="modalData.npdEngineerName" disabled style="width: 155px"></el-input>
  297. </el-form-item>
  298. </el-form>
  299. <el-form :inline="true" label-position="top" :model="modalData">
  300. <el-form-item label="材料有效期备注/Material Validity Time Comments">
  301. <el-input v-model="modalData.materialValidityComments" :disabled="isRohsFieldDisabled('materialValidityComments')" style="width: 260px"></el-input>
  302. </el-form-item>
  303. <el-form-item label="预计提供报告时间(一个月内)/Expect Date" style="margin-left: -2px">
  304. <el-date-picker v-model="modalData.expectReportTime" type="date" value-format="yyyy-MM-dd" :disabled="isRohsFieldDisabled('expectReportTime')" style="width: 259px" :editable=false></el-date-picker>
  305. </el-form-item>
  306. <el-form-item>
  307. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('buyer')" slot="label" @click="getBaseList(2000, 2)"><a herf="#">采购/Buyer</a></span>
  308. <span v-else slot="label">采购/Buyer</span>
  309. <el-input v-model="modalData.buyer" @blur="buyerBlur(2000)" :disabled="isRohsFieldDisabled('buyer')" style="width: 100px"></el-input>
  310. <el-input v-model="modalData.buyerName" disabled style="width: 156px"></el-input>
  311. </el-form-item>
  312. </el-form>
  313. <el-form :inline="true" label-position="top" :model="modalData">
  314. <el-form-item label="所需审批文件/Qualification Documents needed" >
  315. <dict-data-select
  316. :key="'qualification-default-' + (modalData.referenceNo || '') + '-' + (isEditMode ? 'edit' : 'add')"
  317. class="rohs-multiple-two-rows"
  318. v-model="modalData.qualificationDocumentsNeededList"
  319. multiple
  320. :use-default-value="!isEditMode"
  321. :use-type-multi-default-value="!isEditMode"
  322. :title="getMultipleSelectTitle(modalData.qualificationDocumentsNeededList)"
  323. :disabled="isRohsFieldDisabled('qualificationDocumentsNeeded')"
  324. style="width: 807px"
  325. dict-type="rohs_qualification_docs">
  326. </dict-data-select>
  327. </el-form-item>
  328. </el-form>
  329. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 40px">
  330. <el-form-item label="测试报告必测项/Test Report including items">
  331. <dict-data-select
  332. :key="'test-report-default-' + (modalData.referenceNo || '') + '-' + (isEditMode ? 'edit' : 'add')"
  333. class="rohs-multiple-two-rows"
  334. v-model="modalData.testReportIncludingItemsList"
  335. multiple
  336. :use-default-value="!isEditMode"
  337. :use-type-multi-default-value="!isEditMode"
  338. :title="getMultipleSelectTitle(modalData.testReportIncludingItemsList)"
  339. :disabled="isRohsFieldDisabled('testReportIncludingItems')"
  340. style="width: 807px"
  341. dict-type="rohs_test_report_items">
  342. </dict-data-select>
  343. </el-form-item>
  344. </el-form>
  345. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 40px">
  346. <el-form-item style="display: block;">
  347. <template slot="label">
  348. <span>备注说明/Comments</span>
  349. <el-button
  350. v-if="authDataEntry"
  351. style="margin-left: 2px;width: 83px;line-height: 0.5;font-size: 10px;"
  352. type="primary"
  353. @click="openRohsRemarkDialog">备注</el-button>
  354. </template>
  355. <el-input type="textarea" :rows="3" v-model="modalData.remark" :disabled="isRohsFieldDisabled('remark')" resize="none" style="width: 804px;height: 30px"></el-input>
  356. </el-form-item>
  357. </el-form>
  358. </div>
  359. </el-tab-pane>
  360. <!-- NPD 信息 -->
  361. <el-tab-pane label="NPD 信息" name="npdInfo">
  362. <div style="height: 755px; overflow-y: auto;">
  363. <!-- <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -5px;">-->
  364. <!-- <el-form-item label="现有材料不同规格/Same Material Diff Size">-->
  365. <!-- <el-radio-group v-model="modalData.isSameMaterialDiffSize" :disabled="isRohsFieldDisabled('isSameMaterialDiffSize')" style="width: 190px">-->
  366. <!-- <el-radio label="Y" @click.native.prevent="radioClick('isSameMaterialDiffSize', 'Y')"></el-radio>-->
  367. <!-- <el-radio label="N" @click.native.prevent="radioClick('isSameMaterialDiffSize', 'N')"></el-radio>-->
  368. <!-- </el-radio-group>-->
  369. <!-- </el-form-item>-->
  370. <!-- </el-form>-->
  371. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -5px;">
  372. <el-form-item style="display: block;">
  373. <template slot="label">
  374. <span>材料描述/Material Desc.</span>
  375. <el-button
  376. v-if="authMaterialDescRemark"
  377. style="margin-left: 2px;width: 83px;line-height: 0.5;font-size: 10px;"
  378. type="primary"
  379. @click="openRohsMaterialDescDialog">编辑</el-button>
  380. </template>
  381. <el-input type="textarea" :rows="3" v-model="modalData.materialDesc" :disabled="isRohsFieldDisabled('materialDesc')" resize="none" style="width: 804px;height: 30px"></el-input>
  382. </el-form-item>
  383. </el-form>
  384. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 50px">
  385. <el-form-item label="备注说明/NPD Remark" style="display: block;">
  386. <el-input type="textarea" :rows="3" v-model="modalData.npdRemark" :disabled="isRohsFieldDisabled('npdRemark')" resize="none" style="width: 804px;height: 30px"></el-input>
  387. </el-form-item>
  388. </el-form>
  389. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 50px">
  390. <el-form-item label="内部TDS/Inner TDS" style="display: block;">
  391. <oss-components
  392. ref="modalTdsOss"
  393. :save-visible="authFileSave"
  394. :edit-visible="authFileSave"
  395. :download-visible="authFileDownLoad"
  396. :remove-visible="authFileRemove"
  397. :preview-visible="authFilePreview"
  398. :disabled="showModalFlag || modalData.status === '已完成'"
  399. :enable-upgrade="!showModalFlag && modalData.status !== '已完成'"
  400. :require-file-no-rev="true"
  401. :auto-file-no="true"
  402. :single-upload="true"
  403. :row-click-select="true"
  404. :show-order-ref2="false"
  405. label="序列号"
  406. :height="510"
  407. style="margin-top: 2px"
  408. :columns="tdsFileColumnList"
  409. :order-ref1="modalData.site || ''"
  410. :order-ref2="modalData.referenceNo || ''"
  411. order-ref3="tdsProperty">
  412. </oss-components>
  413. </el-form-item>
  414. </el-form>
  415. </div>
  416. </el-tab-pane>
  417. <!-- HSF 填写信息 -->
  418. <el-tab-pane label="HSF 填写信息" name="hsfInfo">
  419. <div style="height: 755px">
  420. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -5px;">
  421. <el-form-item label="报告日期/Report Date">
  422. <el-date-picker v-model="modalData.expiredDate" type="date" value-format="yyyy-MM-dd" :disabled="isRohsFieldDisabled('expiredDate')" style="width: 150px" :editable=false></el-date-picker>
  423. </el-form-item>
  424. <el-form-item label="有效期数值/Valid Until Value">
  425. <el-input-number
  426. v-model="modalData.validUntilValue"
  427. :controls="false"
  428. :min="0"
  429. :step="1"
  430. :precision="0"
  431. :disabled="isValidUntilValueDisabled()"
  432. style="width: 150px">
  433. </el-input-number>
  434. </el-form-item>
  435. <el-form-item label="有效期单位/Valid Until Unit">
  436. <dict-data-select v-model="modalData.validUntil" clearable :disabled="isValidUntilUnitDisabled()" style="width: 150px" dict-type="rohs_valid_until"></dict-data-select>
  437. </el-form-item>
  438. <el-form-item label="失效日期/Expiry Date">
  439. <el-date-picker v-model="modalData.expiryDate" type="date" value-format="yyyy-MM-dd" disabled style="width: 150px" :editable=false></el-date-picker>
  440. </el-form-item>
  441. <el-form-item label="状态/Status">
  442. <el-select v-model="modalData.rohsStatus" clearable :disabled="isRohsFieldDisabled('rohsStatus')" style="width: 150px">
  443. <el-option label="Active" value="Active"></el-option>
  444. <el-option label="Dead" value="Dead"></el-option>
  445. </el-select>
  446. </el-form-item>
  447. </el-form>
  448. <el-form :inline="true" label-position="top" :model="modalData">
  449. <el-form-item label="是否符合RoHS/Meet RoHS Req">
  450. <el-radio-group v-model="modalData.isMeetRohsRequirement" :disabled="isRohsFieldDisabled('isMeetRohsRequirement')" style="width: 190px">
  451. <el-radio label="Y" @click.native.prevent="radioClick('isMeetRohsRequirement', 'Y')"></el-radio>
  452. <el-radio label="N" @click.native.prevent="radioClick('isMeetRohsRequirement', 'N')"></el-radio>
  453. </el-radio-group>
  454. </el-form-item>
  455. <el-form-item label=" ">
  456. <el-checkbox
  457. v-model="modalData.isAhGrade"
  458. true-label="Y"
  459. false-label="N"
  460. :disabled="isRohsFieldDisabled('isAhGrade')"
  461. style="width: 190px">材料属性是否是AH/Is AH Grade</el-checkbox>
  462. </el-form-item>
  463. <el-form-item label="HSF供应商等级/Supplier Class">
  464. <el-radio-group v-model="modalData.hsfSupplierClassification" :disabled="isRohsFieldDisabled('hsfSupplierClassification')" style="width: 260px">
  465. <el-radio label="高风险" @click.native.prevent="radioClick('hsfSupplierClassification', '高风险')">高风险</el-radio>
  466. <el-radio label="中风险" @click.native.prevent="radioClick('hsfSupplierClassification', '中风险')">中风险</el-radio>
  467. <el-radio label="低风险" @click.native.prevent="radioClick('hsfSupplierClassification', '低风险')">低风险</el-radio>
  468. </el-radio-group>
  469. </el-form-item>
  470. </el-form>
  471. <el-form :inline="true" label-position="top" :model="modalData">
  472. <el-form-item label="Fiber报告信息/Fiber Information" style="display: block;">
  473. <el-input type="textarea" :rows="3" v-model="modalData.fiberInformation" :disabled="isRohsFieldDisabled('fiberInformation')" resize="none" style="width: 804px;height: 30px"></el-input>
  474. </el-form-item>
  475. </el-form>
  476. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 45px">
  477. <el-form-item>
  478. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('hsfApprover')" slot="label" @click="openHsfApproverChooseModal"><a herf="#">HSF审批人/HSF Approver</a></span>
  479. <span v-else slot="label">HSF审批人/HSF Approver</span>
  480. <el-input
  481. v-model="modalData.hsfApproverName"
  482. readonly
  483. :disabled="isRohsFieldDisabled('hsfApprover')"
  484. style="width: 396px"
  485. placeholder="请选择人员"
  486. @focus="openHsfApproverChooseModal">
  487. <span slot="suffix" v-show="modalData.hsfApproverName && !isRohsFieldDisabled('hsfApprover')" @click.stop="clearHsfApproverSelection">
  488. <i class="el-icon-circle-close" style="margin-left: 5px;cursor: pointer;"></i>
  489. </span>
  490. </el-input>
  491. </el-form-item>
  492. <el-form-item>
  493. <span style="cursor: pointer" v-if="!isRohsFieldDisabled('relatedPeople')" slot="label" @click="openRelatedPeopleChooseModal"><a herf="#">Inform Related people</a></span>
  494. <span v-else slot="label">Inform Related people</span>
  495. <el-input
  496. v-model="modalData.relatedPeopleName"
  497. readonly
  498. :disabled="isRohsFieldDisabled('relatedPeople')"
  499. style="width: 396px"
  500. placeholder="请从HSF审批人中选择"
  501. @focus="openRelatedPeopleChooseModal">
  502. <span slot="suffix" v-show="modalData.relatedPeopleName && !isRohsFieldDisabled('relatedPeople')" @click.stop="clearRelatedPeopleSelection">
  503. <i class="el-icon-circle-close" style="margin-left: 5px;cursor: pointer;"></i>
  504. </span>
  505. </el-input>
  506. </el-form-item>
  507. </el-form>
  508. <el-form v-if="shouldShowHsfStandard(modalData.endCustomer)" :inline="true" label-position="top" :model="modalData" style="margin-top: 0px">
  509. <el-form-item label="HSF标准/HSF Standard" style="display: block;">
  510. <el-input type="textarea" :rows="3" v-model="modalData.hsfStandard" :disabled="isRohsFieldDisabled('hsfStandard')" resize="none" style="width: 804px;height: 30px"></el-input>
  511. </el-form-item>
  512. </el-form>
  513. </div>
  514. </el-tab-pane>
  515. <!-- 材料信息 -->
  516. <el-tab-pane label="材料信息" name="materialInfo">
  517. <div style="height: 755px">
  518. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -15px;">
  519. <el-form-item label=" ">
  520. <el-button type="primary" v-if="isEditMode && canEditRohsMaterial()" @click="openCreateIfsPartDialog">创建IFS料号</el-button>
  521. <el-button type="primary" v-if="!showModalFlag && canEditRohsMaterial()" @click="openProjectMaterialDialog">关联料号</el-button>
  522. <el-button type="danger" v-if="!showModalFlag && canEditRohsMaterial()" @click="removeSelectedMaterialRows">删除关联</el-button>
  523. </el-form-item>
  524. </el-form>
  525. <el-table
  526. ref="rohsMaterialTable"
  527. class="rohs-material-table"
  528. border
  529. :data="modalData.materialList"
  530. @selection-change="materialSelectionChange"
  531. :header-cell-style="materialDialogHeaderCellStyle"
  532. :height="715"
  533. style="width: 100%">
  534. <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
  535. <el-table-column type="index" label="序号" width="50" header-align="center" align="center"></el-table-column>
  536. <el-table-column prop="finalPartNo" label="IFS物料编码/Final Part No." min-width="150" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  537. <el-table-column prop="partDesc" label="描述/Part Desc." min-width="250" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  538. <el-table-column prop="partStatus" label="状态/Part Status" min-width="100" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  539. </el-table>
  540. </div>
  541. </el-tab-pane>
  542. <el-tab-pane label="附件信息" name="attachmentInfo">
  543. <div style="height: 755px; overflow-y: auto;">
  544. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: -5px;">
  545. <el-form-item label="TDS" style="display: block;">
  546. <oss-components
  547. ref="modalAttachmentTdsOss"
  548. :save-visible="authFileSave"
  549. :edit-visible="authFileSave"
  550. :download-visible="authFileDownLoad"
  551. :remove-visible="authFileRemove"
  552. :preview-visible="authFilePreview"
  553. :row-click-select="true"
  554. :disabled="modalData.status === '已完成'"
  555. label="序列号"
  556. :height="145"
  557. style="margin-top: 2px"
  558. :columns="fileColumnList"
  559. :order-ref1="modalData.site || ''"
  560. :order-ref2="modalData.referenceNo || ''"
  561. order-ref3="rohsAttachmentTds">
  562. </oss-components>
  563. </el-form-item>
  564. </el-form>
  565. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 150px;">
  566. <el-form-item label="MSDS" style="display: block;">
  567. <oss-components
  568. ref="modalAttachmentMsdsOss"
  569. :save-visible="authFileSave"
  570. :edit-visible="authFileSave"
  571. :download-visible="authFileDownLoad"
  572. :remove-visible="authFileRemove"
  573. :preview-visible="authFilePreview"
  574. :row-click-select="true"
  575. :disabled="modalData.status === '已完成'"
  576. label="序列号"
  577. :height="145"
  578. style="margin-top: 2px"
  579. :columns="fileColumnList"
  580. :order-ref1="modalData.site || ''"
  581. :order-ref2="modalData.referenceNo || ''"
  582. order-ref3="rohsAttachmentMsds">
  583. </oss-components>
  584. </el-form-item>
  585. </el-form>
  586. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 150px;">
  587. <el-form-item label="测试报告/Test Report" style="display: block;">
  588. <oss-components
  589. ref="modalAttachmentTestReportOss"
  590. :save-visible="authFileSave"
  591. :edit-visible="authFileSave"
  592. :download-visible="authFileDownLoad"
  593. :remove-visible="authFileRemove"
  594. :preview-visible="authFilePreview"
  595. :row-click-select="true"
  596. :disabled="modalData.status === '已完成'"
  597. label="序列号"
  598. :height="145"
  599. style="margin-top: 2px"
  600. :columns="fileColumnList"
  601. :order-ref1="modalData.site || ''"
  602. :order-ref2="modalData.referenceNo || ''"
  603. order-ref3="rohsAttachmentTestReport">
  604. </oss-components>
  605. </el-form-item>
  606. </el-form>
  607. <el-form :inline="true" label-position="top" :model="modalData" style="margin-top: 150px;">
  608. <el-form-item label="Other" style="display: block;">
  609. <oss-components
  610. ref="modalAttachmentOtherOss"
  611. :save-visible="authFileSave"
  612. :edit-visible="authFileSave"
  613. :download-visible="authFileDownLoad"
  614. :remove-visible="authFileRemove"
  615. :preview-visible="authFilePreview"
  616. :row-click-select="true"
  617. :disabled="modalData.status === '已完成'"
  618. label="序列号"
  619. :height="145"
  620. style="margin-top: 2px"
  621. :columns="fileColumnList"
  622. :order-ref1="modalData.site || ''"
  623. :order-ref2="modalData.referenceNo || ''"
  624. order-ref3="rohsAttachmentOther">
  625. </oss-components>
  626. </el-form-item>
  627. </el-form>
  628. </div>
  629. </el-tab-pane>
  630. </el-tabs>
  631. <el-footer style="height:35px;margin-top: 15px;text-align:center">
  632. <el-button type="primary" v-if="canSaveAction()" @click="dataFormSubmit()">保存</el-button>
  633. <el-button type="primary" @click="handleModalClose">关闭</el-button>
  634. <el-button type="primary" v-if="canAgreeAction()" :loading="submitLoading" @click="agreeSubmit">同意</el-button>
  635. <el-button type="primary" v-if="canRejectAction()" :loading="submitLoading" @click="openRejectModal">驳回</el-button>
  636. </el-footer>
  637. </el-dialog>
  638. <!--选择项目模态框-->
  639. <el-dialog title="选择-项目" :close-on-click-modal="false" @close="closeProjectInfoDialog"
  640. @open="searchProjectInfoList" :visible.sync="chooseProjectListFlag" width="35%">
  641. <el-form label-position="top" :model="searchProjectData" ref="closeProjectInfoForm">
  642. <el-row :gutter="10">
  643. <el-col :span="6">
  644. <el-form-item label="项目号">
  645. <el-input v-model="searchProjectData.projectId"></el-input>
  646. </el-form-item>
  647. </el-col>
  648. <el-col :span="6">
  649. <el-form-item label="项目名称">
  650. <el-input v-model="searchProjectData.projectName"></el-input>
  651. </el-form-item>
  652. </el-col>
  653. <el-col :span="6">
  654. <el-form-item label=" ">
  655. <el-button type="primary" @click="searchProjectInfoList">查询</el-button>
  656. </el-form-item>
  657. </el-col>
  658. </el-row>
  659. <el-table :height="223"
  660. :data="projectList"
  661. border
  662. @row-click="projectClickRow">
  663. <el-table-column label="项目号" prop="projectId"/>
  664. <el-table-column label="项目名称" prop="projectName"/>
  665. </el-table>
  666. </el-form>
  667. <el-footer style="height:35px;margin-top: 10px;text-align:center">
  668. <el-button type="primary" @click="chooseProjectListFlag = false">关闭</el-button>
  669. </el-footer>
  670. </el-dialog>
  671. <el-dialog title="选择物料" top="15vh" width="50%" :close-on-click-modal="false" v-drag :visible.sync="projectMaterialDialogFlag">
  672. <el-form :inline="true" label-position="top" :model="projectMaterialSearchData">
  673. <el-form-item label="IFS物料编码/Final Part No.">
  674. <el-input v-model="projectMaterialSearchData.finalPartNo" clearable style="width: 150px"></el-input>
  675. </el-form-item>
  676. <el-form-item label="描述/Part Desc">
  677. <el-input v-model="projectMaterialSearchData.partDesc" clearable style="width: 200px"></el-input>
  678. </el-form-item>
  679. <el-form-item label="状态/Part Status">
  680. <el-input v-model="projectMaterialSearchData.partStatus" clearable style="width: 100px"></el-input>
  681. </el-form-item>
  682. <el-form-item label=" ">
  683. <el-button type="primary" @click="searchProjectMaterialList">查询</el-button>
  684. </el-form-item>
  685. </el-form>
  686. <el-table
  687. ref="projectMaterialTable"
  688. class="rohs-material-table"
  689. border
  690. v-loading="projectMaterialLoading"
  691. :data="projectMaterialList"
  692. @selection-change="projectMaterialSelectionChange"
  693. :header-cell-style="materialDialogHeaderCellStyle"
  694. :height="320"
  695. style="width: 100%">
  696. <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
  697. <el-table-column prop="finalPartNo" label="IFS物料编码/Final Part No." min-width="120" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  698. <el-table-column prop="partDesc" label="描述/Part Desc." min-width="250" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  699. <el-table-column prop="partStatus" label="状态/Part Status" min-width="80" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  700. </el-table>
  701. <el-pagination
  702. style="margin-top: 10px"
  703. @size-change="projectMaterialSizeChangeHandle"
  704. @current-change="projectMaterialCurrentChangeHandle"
  705. :current-page="projectMaterialPageIndex"
  706. :page-sizes="[20, 50, 100]"
  707. :page-size="projectMaterialPageSize"
  708. :total="projectMaterialTotal"
  709. layout="total, sizes, prev, pager, next, jumper">
  710. </el-pagination>
  711. <el-footer style="height:35px;margin-top: 10px;text-align:center">
  712. <el-button type="primary" @click="confirmProjectMaterialSelection">确定</el-button>
  713. <el-button type="primary" @click="projectMaterialDialogFlag = false">关闭</el-button>
  714. </el-footer>
  715. </el-dialog>
  716. <el-dialog
  717. title="创建IFS料号"
  718. top="7vh"
  719. width="1060px"
  720. v-drag
  721. :close-on-click-modal="false"
  722. :visible.sync="rohsCreatePartDialogFlag"
  723. @close="closeRohsCreatePartDialog">
  724. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  725. <el-form-item label="Site">
  726. <el-input v-model="rohsCreatePartData.site" disabled style="width: 80px"></el-input>
  727. </el-form-item>
  728. <el-form-item label="物料编码 / Part No.">
  729. <el-input v-model="rohsCreatePartData.partNo" clearable style="width: 200px"></el-input>
  730. </el-form-item>
  731. <el-form-item label="物料名称 / Part Desc.">
  732. <el-input v-model="rohsCreatePartData.partDesc" clearable style="width: 360px"></el-input>
  733. </el-form-item>
  734. <el-form-item :label="' '">
  735. <el-button type="primary" @click="nextRohsCreatePartNo">Next Part No</el-button>
  736. </el-form-item>
  737. </el-form>
  738. <el-tabs v-model="rohsCreatePartTab" style="width: 100%;height: 465px;" type="border-card">
  739. <el-tab-pane label="General" name="General">
  740. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  741. <el-form-item label="零件类型 / Part Type">
  742. <el-select v-model="rohsCreatePartData.partType" style="width: 458px">
  743. <el-option label="Manufactured" value="Manufactured"></el-option>
  744. <el-option label="Manufactured Recipe" value="Manufactured Recipe"></el-option>
  745. <el-option label="Purchased (raw)" value="Purchased (raw)"></el-option>
  746. <el-option label="Purchased" value="Purchased"></el-option>
  747. </el-select>
  748. </el-form-item>
  749. <el-form-item>
  750. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(123)"><a herf="#">安全代码 / Safety Code</a></span>
  751. <el-input v-model="rohsCreatePartData.hazardCode" clearable @blur="rohsCreateHazardCodeBlur(123)" style="width: 128px"></el-input>
  752. <el-input v-model="rohsCreatePartData.hazardDesc" disabled style="width: 327px"></el-input>
  753. </el-form-item>
  754. </el-form>
  755. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  756. <el-form-item>
  757. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(113)"><a herf="#">计划人 / Planner</a></span>
  758. <el-input v-model="rohsCreatePartData.productGroupId4" clearable @blur="rohsCreateProductGroupId4Blur(113)" style="width: 128px"></el-input>
  759. <el-input v-model="rohsCreatePartData.productGroupName4" disabled style="width: 327px"></el-input>
  760. </el-form-item>
  761. <el-form-item>
  762. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(112)"><a herf="#">会计组 / Accounting Group</a></span>
  763. <el-input v-model="rohsCreatePartData.productGroupId3" clearable @blur="rohsCreateProductGroupId3Blur(112)" style="width: 128px"></el-input>
  764. <el-input v-model="rohsCreatePartData.productGroupName3" disabled style="width: 327px"></el-input>
  765. </el-form-item>
  766. </el-form>
  767. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  768. <el-form-item>
  769. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(1007)"><a herf="#">计量单位 / Inventory UoM</a></span>
  770. <el-input v-model="rohsCreatePartData.umId" clearable @blur="rohsCreateUmIdBlur(1007)" style="width: 128px"></el-input>
  771. <el-input v-model="rohsCreatePartData.umName" disabled style="width: 327px"></el-input>
  772. </el-form-item>
  773. <el-form-item>
  774. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(109)"><a herf="#">产品代码 / Product Code</a></span>
  775. <el-input v-model="rohsCreatePartData.groupId" clearable @blur="rohsCreateGroupIdBlur(109)" style="width: 128px"></el-input>
  776. <el-input v-model="rohsCreatePartData.groupName" disabled style="width: 327px"></el-input>
  777. </el-form-item>
  778. </el-form>
  779. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  780. <el-form-item>
  781. <span slot="label">商品组1 / Comm Group 1</span>
  782. <el-input v-model="rohsCreatePartData.productGroupId1" readonly style="width: 128px"></el-input>
  783. <el-input v-model="rohsCreatePartData.productGroupName1" disabled style="width: 327px"></el-input>
  784. </el-form-item>
  785. <el-form-item>
  786. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(108)"><a herf="#">产品大类 / Product Family</a></span>
  787. <el-input v-model="rohsCreatePartData.familyId" clearable @blur="rohsCreateFamilyIdBlur(108)" style="width: 128px"></el-input>
  788. <el-input v-model="rohsCreatePartData.familyName" disabled style="width: 327px"></el-input>
  789. </el-form-item>
  790. </el-form>
  791. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  792. <el-form-item>
  793. <span slot="label">商品组2 / Comm Group 2</span>
  794. <el-input v-model="rohsCreatePartData.productGroupId2" readonly style="width: 128px"></el-input>
  795. <el-input v-model="rohsCreatePartData.productGroupName2" disabled style="width: 327px"></el-input>
  796. </el-form-item>
  797. <el-form-item label="类型指定 / Type Designation">
  798. <el-input v-model="rohsCreatePartData.typeDesignation" clearable style="width: 458px"></el-input>
  799. </el-form-item>
  800. </el-form>
  801. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  802. <el-form-item label="商品组3 / Comm Group 3">
  803. <el-input v-model="rohsCreatePartData.commGroup3" readonly style="width: 128px"></el-input>
  804. <el-input v-model="rohsCreatePartData.commGroup3Desc" disabled style="width: 327px"></el-input>
  805. </el-form-item>
  806. </el-form>
  807. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  808. <el-form-item>
  809. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(124)"><a herf="#">资产等级 / Asset Class</a></span>
  810. <el-input v-model="rohsCreatePartData.assetClass" clearable @blur="rohsCreateAssetClassBlur(124)" style="width: 128px"></el-input>
  811. <el-input v-model="rohsCreatePartData.assetClassDesc" disabled style="width: 327px"></el-input>
  812. </el-form-item>
  813. <el-form-item label="尺寸/材质 / Dimension/Quality">
  814. <el-input v-model="rohsCreatePartData.dimQuality" clearable style="width: 458px"></el-input>
  815. </el-form-item>
  816. </el-form>
  817. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  818. <el-form-item>
  819. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(125)"><a herf="#">零件状态 / Part Status</a></span>
  820. <el-input v-model="rohsCreatePartData.partStatus" clearable @blur="rohsCreatePartStatusBlur(125)" style="width: 128px"></el-input>
  821. <el-input v-model="rohsCreatePartData.partStatusDesc" disabled style="width: 327px"></el-input>
  822. </el-form-item>
  823. <el-form-item label="净重">
  824. <el-input class="inlineNumber numInput" v-model="rohsCreatePartData.weightNet" readonly type="number" style="width: 110px"></el-input>
  825. </el-form-item>
  826. <el-form-item label="净重单位" style="margin-left: -10px">
  827. <el-input v-model="rohsCreatePartData.uomForWeightNet" readonly style="width: 110px"></el-input>
  828. </el-form-item>
  829. <el-form-item label="频率级别 / Frequency Class">
  830. <el-input v-model="rohsCreatePartData.frequencyClass" readonly style="width: 220px"></el-input>
  831. </el-form-item>
  832. </el-form>
  833. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  834. <el-form-item>
  835. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(126)"><a herf="#">ABC类 / ABC Class</a></span>
  836. <el-input v-model="rohsCreatePartData.abcClass" clearable @blur="rohsCreateAbcClassBlur(126)" style="width: 128px"></el-input>
  837. <el-input v-model="rohsCreatePartData.abcClassDesc" disabled style="width: 327px"></el-input>
  838. </el-form-item>
  839. <el-form-item label="净数量">
  840. <el-input class="inlineNumber numInput" v-model="rohsCreatePartData.volumeNet" readonly type="number" style="width: 110px"></el-input>
  841. </el-form-item>
  842. <el-form-item label="数量单位" style="margin-left: -10px">
  843. <el-input v-model="rohsCreatePartData.uomForVolumeNet" readonly style="width: 110px"></el-input>
  844. </el-form-item>
  845. <el-form-item label="生命周期阶段 / Lifecycle Stage">
  846. <el-input v-model="rohsCreatePartData.lifecycleStage" readonly style="width: 220px"></el-input>
  847. </el-form-item>
  848. </el-form>
  849. </el-tab-pane>
  850. <el-tab-pane label="Acquisition" name="Acquisition">
  851. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  852. <el-form-item label="制造备货期 / Manufacturing Lead Time">
  853. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.manufacturingLeadTime" @change="rohsChangeExpectedLeadTime" :disabled="!(rohsCreatePartData.partType === 'Manufactured' || rohsCreatePartData.partType === 'Manufactured Recipe')" style="width: 222px"></el-input-number>
  854. </el-form-item>
  855. <el-form-item label="Shelf Life(Weeks)">
  856. <el-input class="inlineNumber numInput" v-model="rohsCreatePartData.durabilityWeek" readonly type="number" style="width: 221px"></el-input>
  857. </el-form-item>
  858. <el-form-item>
  859. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(127)"><a herf="#">来源国家 / Country of Origin</a></span>
  860. <el-input v-model="rohsCreatePartData.countryOfOrigin" clearable @blur="rohsCreateCountryOfOriginBlur(127)" style="width: 128px"></el-input>
  861. <el-input v-model="rohsCreatePartData.countryOfOriginDesc" disabled style="width: 327px"></el-input>
  862. </el-form-item>
  863. </el-form>
  864. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  865. <el-form-item label="预期提前期 / Expected Lead Time">
  866. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.expectedLeadTime" style="width: 222px"></el-input-number>
  867. </el-form-item>
  868. <el-form-item label="Shelf Life(Days)">
  869. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.durabilityDay" @change="rohsChangeDurabilityWeek" style="width: 221px"></el-input-number>
  870. </el-form-item>
  871. <el-form-item>
  872. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(128)"><a herf="#">区域代码 / Region Code</a></span>
  873. <el-input v-model="rohsCreatePartData.regionOfOrigin" clearable @blur="rohsCreateRegionOfOriginBlur(128)" style="width: 128px"></el-input>
  874. <el-input v-model="rohsCreatePartData.regionOfOriginDesc" disabled style="width: 327px"></el-input>
  875. </el-form-item>
  876. </el-form>
  877. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  878. <el-form-item label="州内转换因子 / Intrastat Conv Factor">
  879. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.intrastatConvFactor" style="width: 128px"></el-input-number>
  880. <el-input v-model="rohsCreatePartData.umDesc" disabled style="width: 327px"></el-input>
  881. </el-form-item>
  882. <el-form-item>
  883. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(129)"><a herf="#">海关统计序号 / Customs Stat No</a></span>
  884. <el-input v-model="rohsCreatePartData.customsStatNo" clearable @blur="rohsCreateCustomsStatNoBlur(129)" style="width: 128px"></el-input>
  885. <el-input v-model="rohsCreatePartData.customsStatDesc" disabled style="width: 327px"></el-input>
  886. </el-form-item>
  887. </el-form>
  888. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  889. <el-form-item label="默认物料需求供应 / Default Mtr Req Supply">
  890. <el-select v-model="rohsCreatePartData.supplyCode" style="width: 458px" clearable>
  891. <el-option label="Inventory Order" value="Inventory Order"></el-option>
  892. <el-option label="Purchase Order" value="Purchase Order"></el-option>
  893. </el-select>
  894. </el-form-item>
  895. </el-form>
  896. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  897. <el-form-item label="备注" style="height: 80px">
  898. <el-input type="textarea" v-model="rohsCreatePartData.remark" :rows="3" resize='none' show-word-limit style="width: 931px"></el-input>
  899. </el-form-item>
  900. </el-form>
  901. </el-tab-pane>
  902. <el-tab-pane label="Costs" name="Costs">
  903. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  904. <el-form-item label="配置标识 / Configuration ID">
  905. <el-select v-model="rohsCreatePartData.configurationId" style="width: 220px">
  906. <el-option label="*" value="*"></el-option>
  907. </el-select>
  908. </el-form-item>
  909. <el-form-item label="估计物料成本 / Estimated Material Cost">
  910. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.estimatedMaterialCost" style="width: 220px"></el-input-number>
  911. </el-form-item>
  912. </el-form>
  913. </el-tab-pane>
  914. <el-tab-pane label="Misc Part Info" name="MiscPartInfo">
  915. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  916. <el-form-item label="库存估价方法 / Inventory Valuation Method">
  917. <el-select v-model="rohsCreatePartData.inventoryValuationMethod" style="width: 458px">
  918. <el-option label="Weighted Average" value="Weighted Average"></el-option>
  919. <el-option label="Standard Cost" value="Standard Cost"></el-option>
  920. <el-option label="First In First Out" value="First In First Out"></el-option>
  921. <el-option label="Last In First Out" value="Last In First Out"></el-option>
  922. </el-select>
  923. </el-form-item>
  924. <el-form-item>
  925. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(131)"><a herf="#">零件成本组 / Part Cost Group</a></span>
  926. <el-input v-model="rohsCreatePartData.partCostGroupId" clearable @blur="rohsCreatePartCostGroupIdBlur(131)" style="width: 128px"></el-input>
  927. <el-input v-model="rohsCreatePartData.partCostGroupDesc" disabled style="width: 327px"></el-input>
  928. </el-form-item>
  929. </el-form>
  930. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  931. <el-form-item label="库存件成本层 / Inventory Part Cost Level">
  932. <el-select v-model="rohsCreatePartData.inventoryPartCostLevel" style="width: 458px">
  933. <el-option label="Cost Per Part" value="Cost Per Part"></el-option>
  934. <el-option label="Cost Per Configuration" value="Cost Per Configuration"></el-option>
  935. <el-option label="Cost Per Condition" value="Cost Per Condition"></el-option>
  936. <el-option label="Cost Per Lot Batch" value="Cost Per Lot Batch"></el-option>
  937. <el-option label="Cost Per Serial" value="Cost Per Serial"></el-option>
  938. </el-select>
  939. </el-form-item>
  940. </el-form>
  941. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  942. <el-form-item label="供应商发票事项 / Supplier Invoice Consideration">
  943. <el-select v-model="rohsCreatePartData.invoiceConsideration" style="width: 458px">
  944. <el-option label="Ignore Invoice Price" value="Ignore Invoice Price"></el-option>
  945. <el-option label="Periodic Weighted Average" value="Periodic Weighted Average"></el-option>
  946. <el-option label="Transaction Based" value="Transaction Based"></el-option>
  947. </el-select>
  948. </el-form-item>
  949. </el-form>
  950. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  951. <el-form-item label="零成本 / Zero Cost">
  952. <el-select v-model="rohsCreatePartData.zeroCostFlag" style="width: 458px">
  953. <el-option label="Zero Cost Allowed" value="Zero Cost Allowed"></el-option>
  954. <el-option label="Zero Cost Forbidden" value="Zero Cost Forbidden"></el-option>
  955. <el-option label="Zero Cost Only" value="Zero Cost Only"></el-option>
  956. </el-select>
  957. </el-form-item>
  958. </el-form>
  959. </el-tab-pane>
  960. <el-tab-pane label="Planning Data" name="PlanningData">
  961. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  962. <el-form-item>
  963. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(132)"><a herf="#">计划方法 / Planning Method</a></span>
  964. <el-input v-model="rohsCreatePartData.planningMethod" clearable @blur="rohsCreatePlanningMethodBlur(132)" style="width: 170px"></el-input>
  965. </el-form-item>
  966. <el-form-item label=" ">
  967. <el-input v-model="rohsCreatePartData.planningMethodDesc" disabled style="width: 510px"></el-input>
  968. </el-form-item>
  969. </el-form>
  970. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  971. <el-form-item label="安全库存 / Safety Stock">
  972. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.safetyStock" style="width: 170px"></el-input-number>
  973. </el-form-item>
  974. <el-form-item label="最小批量 / Min Lot Size">
  975. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.minOrderQty" style="width: 170px"></el-input-number>
  976. </el-form-item>
  977. <el-form-item label="最大批量 / Max Lot Size">
  978. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.maxOrderQty" style="width: 155px"></el-input-number>
  979. </el-form-item>
  980. <el-form-item label="多种批量大小 / Multiple Lot Size">
  981. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.mulOrderQty" style="width: 155px"></el-input-number>
  982. </el-form-item>
  983. </el-form>
  984. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  985. <el-form-item label="安全提前期 / Safety Lead Time">
  986. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.safetyLeadTime" style="width: 170px"></el-input-number>
  987. </el-form-item>
  988. <el-form-item label="报废因子(%) / Scrap Factor(%)">
  989. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.shrinkageFac" style="width: 170px"></el-input-number>
  990. </el-form-item>
  991. <el-form-item label="标准批量大小 / Std Lot Size">
  992. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.stdOrderQty" style="width: 155px"></el-input-number>
  993. </el-form-item>
  994. </el-form>
  995. </el-tab-pane>
  996. <el-tab-pane label="Manufacturing" name="Manufacturing">
  997. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  998. <el-form-item label="累计提前期 / Cum Lead Time">
  999. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.cumLeadTime" style="width: 294px"></el-input-number>
  1000. </el-form-item>
  1001. <el-form-item label="预留/下发来源 / Reserve/Issue from">
  1002. <el-select v-model="rohsCreatePartData.backFlushPart" style="width: 248px">
  1003. <el-option label="All Locations" value="All Locations"></el-option>
  1004. <el-option label="Only Floor Stock" value="Only Floor Stock"></el-option>
  1005. <el-option label="Only Specified Location" value="Only Specified Location"></el-option>
  1006. </el-select>
  1007. </el-form-item>
  1008. <el-form-item style="margin-top: 23px">
  1009. <el-checkbox v-model="rohsCreatePartData.byProdAsSupplyInMrpDb" true-label="Y">将副产品用作MRP中的供应 / Use By-Product as Supply in MRP</el-checkbox>
  1010. </el-form-item>
  1011. </el-form>
  1012. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  1013. <el-form-item label="未受保护提前期 / Unprotected Lead Time">
  1014. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.unprotectedLeadTime" style="width: 294px"></el-input-number>
  1015. </el-form-item>
  1016. <el-form-item label="预留/下发方法 / Reserve/Issue Method">
  1017. <el-select v-model="rohsCreatePartData.issueType" style="width: 248px">
  1018. <el-option label="Reserve" value="Reserve"></el-option>
  1019. <el-option label="Backflush" value="Backflush"></el-option>
  1020. <el-option label="Reserve And Backflush" value="Reserve And Backflush"></el-option>
  1021. <el-option label="Manual" value="Manual"></el-option>
  1022. </el-select>
  1023. </el-form-item>
  1024. <el-form-item style="margin-top: 23px">
  1025. <el-checkbox v-model="rohsCreatePartData.mrpControlFlagDb" true-label="Y">MRP控制 / MRP Control</el-checkbox>
  1026. </el-form-item>
  1027. </el-form>
  1028. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  1029. <el-form-item label="按日固定提前期 / Fixed Lead Time by Day">
  1030. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.fixedLeadTimeDay" style="width: 294px"></el-input-number>
  1031. </el-form-item>
  1032. <el-form-item label="过度报告 / Over Reporting">
  1033. <el-select v-model="rohsCreatePartData.overReporting" style="width: 248px">
  1034. <el-option label="Allowed" value="Allowed"></el-option>
  1035. <el-option label="Allowed with Warning" value="Allowed with Warning"></el-option>
  1036. <el-option label="Not Allowed" value="Not Allowed"></el-option>
  1037. </el-select>
  1038. </el-form-item>
  1039. <el-form-item style="margin-top: 23px">
  1040. <el-checkbox v-model="rohsCreatePartData.useTheoreticalDensityDb" true-label="Y">使用理论 / Use Theoretical</el-checkbox>
  1041. </el-form-item>
  1042. </el-form>
  1043. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  1044. <el-form-item label="按天的可变化提前期 / Variable Lead Time by Day">
  1045. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.variableLeadTimeDay" style="width: 294px"></el-input-number>
  1046. </el-form-item>
  1047. <el-form-item label="报告公差过大 / Over Report Tolerance">
  1048. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.overReportTolerance" style="width: 248px"></el-input-number>
  1049. </el-form-item>
  1050. </el-form>
  1051. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  1052. <el-form-item label="按小时的固定提前期 / Fixed Lead Time by Hour">
  1053. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.fixedLeadTimeHour" style="width: 294px"></el-input-number>
  1054. </el-form-item>
  1055. <el-form-item label="密度 / Density">
  1056. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.density" style="width: 248px"></el-input-number>
  1057. </el-form-item>
  1058. </el-form>
  1059. <el-form :inline="true" label-position="top" :model="rohsCreatePartData">
  1060. <el-form-item label="按小时计算的可变提前期 / Variable Lead Time by Hour">
  1061. <el-input-number :controls="false" :step="0" v-model="rohsCreatePartData.variableLeadTimeHour" style="width: 294px"></el-input-number>
  1062. </el-form-item>
  1063. </el-form>
  1064. </el-tab-pane>
  1065. <el-tab-pane label="Characteristics" name="Characteristics">
  1066. <el-form :inline="true" label-position="top" :model="rohsCreatePartData" style="margin-top: -5px;">
  1067. <el-form-item>
  1068. <span style="cursor: pointer" slot="label" @click="openRohsCreatePartBaseList(20)"><a herf="#">属性模板</a></span>
  1069. <el-input v-model="rohsCreatePartData.codeNo" clearable @blur="rohsCreateCodeNoBlur(20)" style="width: 128px"></el-input>
  1070. <el-input v-model="rohsCreatePartData.codeDesc" disabled style="width: 327px"></el-input>
  1071. </el-form-item>
  1072. <el-form-item :label="' '">
  1073. <el-button type="primary" @click="openRohsCharacteristicDialog">新增</el-button>
  1074. <el-button type="primary" @click="removeRohsPartItemRows">删除</el-button>
  1075. </el-form-item>
  1076. </el-form>
  1077. <div class="rq">
  1078. <el-table
  1079. :data="rohsCreatePartData.partItemList"
  1080. height="355px"
  1081. border
  1082. @selection-change="rohsPartItemSelectionChange"
  1083. style="width: 100%">
  1084. <el-table-column
  1085. type="selection"
  1086. align="center"
  1087. width="50">
  1088. </el-table-column>
  1089. <el-table-column
  1090. v-for="(item,index) in rohsCreatePartColumnItemList" :key="index"
  1091. :sortable="item.columnSortable"
  1092. :prop="item.columnProp"
  1093. :header-align="item.headerAlign"
  1094. :show-overflow-tooltip="item.showOverflowTooltip"
  1095. :align="item.align"
  1096. :fixed="item.fixed===''?false:item.fixed"
  1097. :min-width="item.columnWidth"
  1098. :label="item.columnLabel">
  1099. <template slot-scope="scope">
  1100. <div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
  1101. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  1102. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  1103. </div>
  1104. <div v-else>
  1105. <div v-if="scope.row.valueChooseFlag !== 'Y'">
  1106. <el-input-number v-if="scope.row.valueTypeDb === 'N'" v-model="scope.row.numValue" style="padding: 0;width: 100%" :controls="false"></el-input-number>
  1107. <el-input v-else v-model="scope.row.textValue"></el-input>
  1108. </div>
  1109. <div v-else>
  1110. <el-select style="width: 100%;" v-if="scope.row.valueTypeDb === 'T'" v-model="scope.row.textValue" clearable>
  1111. <el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
  1112. </el-select>
  1113. <el-select style="width: 100%;" v-else v-model="scope.row.numValue" clearable>
  1114. <el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
  1115. </el-select>
  1116. </div>
  1117. </div>
  1118. </template>
  1119. </el-table-column>
  1120. </el-table>
  1121. </div>
  1122. </el-tab-pane>
  1123. </el-tabs>
  1124. <el-footer style="height:35px;margin-top: 10px;text-align:center">
  1125. <el-button type="primary" :loading="rohsCreatePartLoading" @click="saveRohsCreatePart">保存</el-button>
  1126. <el-button type="primary" @click="rohsCreatePartDialogFlag = false">关闭</el-button>
  1127. </el-footer>
  1128. </el-dialog>
  1129. <el-dialog title="物料属性" :close-on-click-modal="false" v-drag :visible.sync="rohsCharacteristicDialogFlag" width="730px">
  1130. <el-form :inline="true" label-position="top" :model="rohsCharacteristicQueryData">
  1131. <el-form-item :label="'属性编码'">
  1132. <el-input v-model="rohsCharacteristicQueryData.propertiesItemNo" clearable style="width: 200px"></el-input>
  1133. </el-form-item>
  1134. <el-form-item :label="'属性名称'">
  1135. <el-input v-model="rohsCharacteristicQueryData.itemDesc" clearable style="width: 200px"></el-input>
  1136. </el-form-item>
  1137. <el-form-item :label="' '">
  1138. <el-button type="primary" @click="queryRohsCharacteristicOptions">查询</el-button>
  1139. </el-form-item>
  1140. </el-form>
  1141. <el-table
  1142. :height="250"
  1143. :data="rohsCharacteristicList"
  1144. border
  1145. ref="rohsCharacteristicTable"
  1146. @row-click="rohsCharacteristicRowClick"
  1147. @selection-change="rohsCharacteristicSelectionChange"
  1148. style="width: 100%;">
  1149. <el-table-column type="selection" align="center" width="50"></el-table-column>
  1150. <el-table-column
  1151. v-for="(item,index) in rohsCharacteristicColumnList" :key="index"
  1152. :sortable="item.columnSortable"
  1153. :prop="item.columnProp"
  1154. :header-align="item.headerAlign"
  1155. :show-overflow-tooltip="item.showOverflowTooltip"
  1156. :align="item.align"
  1157. :fixed="item.fixed===''?false:item.fixed"
  1158. :min-width="item.columnWidth"
  1159. :label="item.columnLabel">
  1160. <template slot-scope="scope">
  1161. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  1162. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  1163. </template>
  1164. </el-table-column>
  1165. </el-table>
  1166. <el-footer style="height:40px;margin-top: 10px;text-align:center">
  1167. <el-button type="primary" @click="saveRohsCharacteristics">保存</el-button>
  1168. <el-button type="primary" @click="rohsCharacteristicDialogFlag = false">关闭</el-button>
  1169. </el-footer>
  1170. </el-dialog>
  1171. <el-dialog title="人员选择" @open="openHsfApproverDialog" @close="closeHsfApproverDialog" v-drag
  1172. :visible.sync="hsfApproverFlag" width="40vw" :close-on-click-modal="false">
  1173. <el-form :inline="true" label-position="top" :model="hsfApproverSearchData">
  1174. <el-form-item label="编码">
  1175. <el-input v-model="hsfApproverSearchData.operatorId" clearable style="width: 120px"></el-input>
  1176. </el-form-item>
  1177. <el-form-item label="名称">
  1178. <el-input v-model="hsfApproverSearchData.operatorName" clearable style="width: 120px"></el-input>
  1179. </el-form-item>
  1180. <el-form-item label=" ">
  1181. <el-button type="primary" @click="filterHsfApproverOptions">查询</el-button>
  1182. </el-form-item>
  1183. </el-form>
  1184. <el-table v-if="hsfApproverFlag"
  1185. :height="300"
  1186. :data="hsfApproverDisplayList"
  1187. @selection-change="handleHsfApproverSelectionChange"
  1188. @row-click="(row,column,event) => handleHsfApproverTableClick(row,column,event,'hsfApproverTable')"
  1189. ref="hsfApproverTable"
  1190. border row-key="operatorId"
  1191. style="width: 100%;">
  1192. <el-table-column
  1193. type="selection"
  1194. header-align="center"
  1195. align="center"
  1196. :reserve-selection="true"
  1197. width="50">
  1198. </el-table-column>
  1199. <el-table-column label="编码" property="operatorId" align="left" header-align="center"/>
  1200. <el-table-column label="名称" property="operatorName" align="left" header-align="center"/>
  1201. </el-table>
  1202. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  1203. <el-button type="primary" @click="saveHsfApproverChooseModal">确定</el-button>
  1204. <el-button type="primary" @click="hsfApproverFlag = false">关闭</el-button>
  1205. </el-footer>
  1206. </el-dialog>
  1207. <el-dialog title="人员选择" @open="openRelatedPeopleDialog" @close="closeRelatedPeopleDialog" v-drag
  1208. :visible.sync="relatedPeopleFlag" width="40vw" :close-on-click-modal="false">
  1209. <el-form :inline="true" label-position="top" :model="relatedPeopleSearchData">
  1210. <el-form-item label="编码">
  1211. <el-input v-model="relatedPeopleSearchData.operatorId" clearable style="width: 120px"></el-input>
  1212. </el-form-item>
  1213. <el-form-item label="名称">
  1214. <el-input v-model="relatedPeopleSearchData.operatorName" clearable style="width: 120px"></el-input>
  1215. </el-form-item>
  1216. <el-form-item label=" ">
  1217. <el-button type="primary" @click="filterRelatedPeopleOptions">查询</el-button>
  1218. </el-form-item>
  1219. </el-form>
  1220. <el-table v-if="relatedPeopleFlag"
  1221. :height="300"
  1222. :data="relatedPeopleDisplayList"
  1223. highlight-current-row
  1224. @current-change="handleRelatedPeopleCurrentChange"
  1225. @row-click="handleRelatedPeopleTableClick"
  1226. ref="relatedPeopleTable"
  1227. border
  1228. style="width: 100%;">
  1229. <el-table-column label="编码" property="operatorId" align="left" header-align="center"/>
  1230. <el-table-column label="名称" property="operatorName" align="left" header-align="center"/>
  1231. </el-table>
  1232. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  1233. <el-button type="primary" @click="saveRelatedPeopleChooseModal">确定</el-button>
  1234. <el-button type="primary" @click="relatedPeopleFlag = false">关闭</el-button>
  1235. </el-footer>
  1236. </el-dialog>
  1237. <el-dialog title="驳回" top="30vh" :close-on-click-modal="false" v-drag :visible.sync="submitModalFlag" width="500px">
  1238. <el-form label-position="top">
  1239. <el-form-item label="驳回意见/Reject Opinion">
  1240. <el-input type="textarea" v-model="rejectOpinion" :rows="3" resize="none" show-word-limit style="width: 479px;height: 30px"></el-input>
  1241. </el-form-item>
  1242. </el-form>
  1243. <el-footer style="height:35px;margin-top:50px;text-align:center">
  1244. <el-button type="primary" :loading="submitLoading" @click="rejectSubmit">确定</el-button>
  1245. <el-button type="primary" @click="submitModalFlag = false">取消</el-button>
  1246. </el-footer>
  1247. </el-dialog>
  1248. <el-dialog width="700px" title="备注" :close-on-click-modal="false" :visible.sync="rohsRemarkFlag" v-drag>
  1249. <el-form label-position="top">
  1250. <el-form-item label="备注说明">
  1251. <el-input
  1252. type="textarea"
  1253. v-model="rohsRemarkForm.remark"
  1254. :rows="6"
  1255. maxlength="255"
  1256. show-word-limit
  1257. resize="none">
  1258. </el-input>
  1259. </el-form-item>
  1260. </el-form>
  1261. <el-footer style="height:35px;margin-top:110px;text-align:center">
  1262. <el-button type="primary" @click="refreshRohsRemark">刷新</el-button>
  1263. <el-button type="primary" @click="saveRohsRemark">保存</el-button>
  1264. <el-button type="primary" @click="rohsRemarkFlag = false">取消</el-button>
  1265. </el-footer>
  1266. </el-dialog>
  1267. <el-dialog width="700px" title="材料描述" :close-on-click-modal="false" :visible.sync="rohsMaterialDescFlag" v-drag>
  1268. <el-form label-position="top">
  1269. <el-form-item label="材料描述">
  1270. <el-input
  1271. type="textarea"
  1272. v-model="rohsMaterialDescForm.materialDesc"
  1273. :rows="6"
  1274. maxlength="255"
  1275. show-word-limit
  1276. resize="none">
  1277. </el-input>
  1278. </el-form-item>
  1279. </el-form>
  1280. <el-footer style="height:35px;margin-top:110px;text-align:center">
  1281. <el-button type="primary" @click="refreshRohsMaterialDesc">刷新</el-button>
  1282. <el-button type="primary" @click="saveRohsMaterialDesc">保存</el-button>
  1283. <el-button type="primary" @click="rohsMaterialDescFlag = false">取消</el-button>
  1284. </el-footer>
  1285. </el-dialog>
  1286. <!-- 底部附件页签 -->
  1287. <el-tabs v-model="activeTable" style="width: 100%; height: 100%;" type="border-card" @tab-click="refreshCurrentTabTable" class="customer-tab">
  1288. <el-tab-pane label="基本信息" name="basicInfo">
  1289. <div :style="{height: secondHeight + 'px'}" style="margin-left: 5px;margin-top: 5px; overflow-y: auto;">
  1290. <el-form :inline="true" label-position="top" :model="currentRow">
  1291. <el-form-item>
  1292. <span slot="label">申请人/Reference No.</span>
  1293. <el-input :value="currentRow.applicant || ''" disabled style="width: 100px"></el-input>
  1294. <el-input :value="currentRow.applicantName || ''" disabled style="width: 155px"></el-input>
  1295. </el-form-item>
  1296. <el-form-item label="申请日期/Date">
  1297. <el-date-picker :value="currentRow.applicationDate" disabled type="date" value-format="yyyy-MM-dd" style="width: 150px"></el-date-picker>
  1298. </el-form-item>
  1299. <el-form-item label="Site">
  1300. <el-input :value="currentRow.site || ''" disabled style="width: 95px"></el-input>
  1301. </el-form-item>
  1302. <el-form-item label="工艺/Process">
  1303. <el-input :value="currentRow.process || ''" disabled style="width: 121px"></el-input>
  1304. </el-form-item>
  1305. </el-form>
  1306. <el-form :inline="true" label-position="top" :model="currentRow">
  1307. <el-form-item>
  1308. <span slot="label">最终客户/End Customer</span>
  1309. <el-input :value="currentRow.endCustomer || ''" disabled style="width: 100px"></el-input>
  1310. <el-input :value="currentRow.endCustomerName || ''" disabled style="width: 155px"></el-input>
  1311. </el-form-item>
  1312. <el-form-item>
  1313. <span slot="label">项目编码/Project</span>
  1314. <el-input :value="currentRow.projectId || ''" disabled style="width: 100px"></el-input>
  1315. <el-input :value="currentRow.projectName || ''" disabled style="width: 155px"></el-input>
  1316. </el-form-item>
  1317. <el-form-item label="WM所需求规格/The size that WM need">
  1318. <el-input :value="currentRow.wmRequiredSpec || ''" disabled style="width: 260px"></el-input>
  1319. </el-form-item>
  1320. </el-form>
  1321. <el-form :inline="true" label-position="top" :model="currentRow">
  1322. <el-form-item label="供应商/Vendor Code">
  1323. <el-input :value="currentRow.vendorCode || ''" disabled style="width: 396px"></el-input>
  1324. </el-form-item>
  1325. <el-form-item label="供应商材料编码/Vendor Material Code">
  1326. <el-input :value="currentRow.vendorMaterialCode || ''" disabled style="width: 396px"></el-input>
  1327. </el-form-item>
  1328. </el-form>
  1329. <el-form :inline="true" label-position="top" :model="currentRow">
  1330. <el-form-item label="材料分类/Material Classify">
  1331. <el-input type="textarea" :rows="2" resize="none" :value="currentRow.materialClassify || ''" disabled style="width: 532px"></el-input>
  1332. </el-form-item>
  1333. <el-form-item label="其他分类/Other Material Classify" v-if="currentRow.materialClassify && currentRow.materialClassify.includes('Other其他')">
  1334. <el-input :value="currentRow.otherMaterialClassify || ''" disabled style="width: 260px"></el-input>
  1335. </el-form-item>
  1336. </el-form>
  1337. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 30px">
  1338. <el-form-item label="辅材用途/Assiaccessorial Material Use for">
  1339. <el-input :value="currentRow.materialUseFor || ''" disabled style="width: 259px"></el-input>
  1340. </el-form-item>
  1341. <el-form-item>
  1342. <span slot="label">技术计划/TP</span>
  1343. <el-input :value="currentRow.technicalPlan || ''" disabled style="width: 100px"></el-input>
  1344. <el-input :value="currentRow.technicalPlanName || ''" disabled style="width: 155px"></el-input>
  1345. </el-form-item>
  1346. <el-form-item>
  1347. <span slot="label">PM人员/PM</span>
  1348. <el-input :value="currentRow.pm || ''" disabled style="width: 100px"></el-input>
  1349. <el-input :value="currentRow.pmName || ''" disabled style="width: 156px"></el-input>
  1350. </el-form-item>
  1351. </el-form>
  1352. <el-form :inline="true" label-position="top" :model="currentRow">
  1353. <el-form-item label="颜色/Color">
  1354. <el-input :value="currentRow.color || ''" disabled style="width: 532px"></el-input>
  1355. </el-form-item>
  1356. <el-form-item label="计划转量产时间/Planned Mass Production Date">
  1357. <el-date-picker :value="normalizeDateOnly(currentRow.plannedMassProductionDate)" disabled type="date" value-format="yyyy-MM-dd" style="width: 260px"></el-date-picker>
  1358. </el-form-item>
  1359. </el-form>
  1360. <el-form :inline="true" label-position="top" :model="currentRow">
  1361. <el-form-item>
  1362. <span slot="label">商品组1/Comm Group 1</span>
  1363. <el-input :value="currentRow.commGroup1 || ''" disabled style="width: 100px"></el-input>
  1364. <el-input :value="currentRow.commGroup1Desc || ''" disabled style="width: 155px"></el-input>
  1365. </el-form-item>
  1366. <el-form-item>
  1367. <span slot="label">商品组2/Comm Group 2</span>
  1368. <el-input :value="currentRow.commGroup2 || ''" disabled style="width: 100px"></el-input>
  1369. <el-input :value="currentRow.commGroup2Desc || ''" disabled style="width: 155px"></el-input>
  1370. </el-form-item>
  1371. <el-form-item>
  1372. <span slot="label">商品组3/Comm Group 3</span>
  1373. <el-input :value="currentRow.commGroup3 || ''" disabled style="width: 100px"></el-input>
  1374. <el-input :value="currentRow.commGroup3Desc || ''" disabled style="width: 156px"></el-input>
  1375. </el-form-item>
  1376. </el-form>
  1377. <el-form :inline="true" label-position="top" :model="currentRow">
  1378. <el-form-item label="是否是Fiber材料">
  1379. <el-radio-group :value="currentRow.isFiberMaterial" disabled style="width: 145px">
  1380. <el-radio label="Y"></el-radio>
  1381. <el-radio label="N"></el-radio>
  1382. </el-radio-group>
  1383. </el-form-item>
  1384. <el-form-item label="是否需要创建300/700/900号/Dose Need Create 300/700/900 Number">
  1385. <el-radio-group :value="currentRow.needCreateNumber" disabled style="width: 374px">
  1386. <el-radio label="Y"></el-radio>
  1387. <el-radio label="N"></el-radio>
  1388. </el-radio-group>
  1389. </el-form-item>
  1390. <el-form-item label="材料厚度/Material Thickness">
  1391. <el-input :value="currentRow.materialThickness || ''" disabled style="width: 260px"></el-input>
  1392. </el-form-item>
  1393. </el-form>
  1394. <el-form :inline="true" label-position="top" :model="currentRow">
  1395. <el-form-item label="材料有效期/Material Validity Time">
  1396. <dict-data-select :value="currentRow.materialValidityTime || ''" :use-default-value="false" disabled style="width: 260px" dict-type="rohs_material_validity_time"></dict-data-select>
  1397. </el-form-item>
  1398. <el-form-item label="是否需要Deviation/If need deviation or not">
  1399. <el-radio-group :value="currentRow.needDeviation" disabled style="width: 259px">
  1400. <el-radio label="Y"></el-radio>
  1401. <el-radio label="N"></el-radio>
  1402. </el-radio-group>
  1403. </el-form-item>
  1404. <el-form-item>
  1405. <span slot="label">NPD工程师/NPD Engineer</span>
  1406. <el-input :value="currentRow.npdEngineer || ''" disabled style="width: 100px"></el-input>
  1407. <el-input :value="currentRow.npdEngineerName || ''" disabled style="width: 155px"></el-input>
  1408. </el-form-item>
  1409. </el-form>
  1410. <el-form :inline="true" label-position="top" :model="currentRow">
  1411. <el-form-item label="材料有效期备注/Material Validity Time Comments">
  1412. <el-input :value="currentRow.materialValidityComments || ''" disabled style="width: 260px"></el-input>
  1413. </el-form-item>
  1414. <el-form-item label="预计提供报告时间(一个月内)/Expect Date" style="margin-left: -2px">
  1415. <el-date-picker :value="normalizeDateOnly(currentRow.expectReportTime)" disabled type="date" value-format="yyyy-MM-dd" style="width: 259px"></el-date-picker>
  1416. </el-form-item>
  1417. <el-form-item>
  1418. <span slot="label">采购/Buyer</span>
  1419. <el-input :value="currentRow.buyer || ''" disabled style="width: 100px"></el-input>
  1420. <el-input :value="currentRow.buyerName || ''" disabled style="width: 156px"></el-input>
  1421. </el-form-item>
  1422. </el-form>
  1423. <el-form :inline="true" label-position="top" :model="currentRow">
  1424. <el-form-item label="所需审批文件/Qualification Documents needed">
  1425. <el-input type="textarea" :rows="2" resize="none" :value="currentRow.qualificationDocumentsNeeded || ''" disabled style="width: 807px"></el-input>
  1426. </el-form-item>
  1427. </el-form>
  1428. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 30px">
  1429. <el-form-item label="测试报告必测项/Test Report including items">
  1430. <el-input type="textarea" :rows="2" resize="none" :value="currentRow.testReportIncludingItems || ''" disabled style="width: 807px"></el-input>
  1431. </el-form-item>
  1432. </el-form>
  1433. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 30px">
  1434. <el-form-item label="备注说明/Comments" style="display: block;">
  1435. <el-input type="textarea" :rows="3" :value="currentRow.remark || ''" disabled resize="none" style="width: 804px;height: 30px"></el-input>
  1436. </el-form-item>
  1437. </el-form>
  1438. </div>
  1439. </el-tab-pane>
  1440. <el-tab-pane label="NPD 信息" name="npdInfo">
  1441. <div :style="{height: secondHeight + 'px'}" style="margin-left: 5px;margin-top: 5px; overflow-y: auto;">
  1442. <!-- <el-form :inline="true" label-position="top" :model="currentRow">-->
  1443. <!-- <el-form-item label="现有材料不同规格/Same Material Diff Size">-->
  1444. <!-- <el-radio-group :value="currentRow.isSameMaterialDiffSize" disabled style="width: 190px">-->
  1445. <!-- <el-radio label="Y"></el-radio>-->
  1446. <!-- <el-radio label="N"></el-radio>-->
  1447. <!-- </el-radio-group>-->
  1448. <!-- </el-form-item>-->
  1449. <!-- </el-form>-->
  1450. <el-form :inline="true" label-position="top" :model="currentRow">
  1451. <el-form-item label="材料描述/Material Desc." style="display: block;"><el-input type="textarea" :rows="3" :value="currentRow.materialDesc || ''" disabled resize="none" style="width: 804px;height: 30px"></el-input></el-form-item>
  1452. </el-form>
  1453. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 50px">
  1454. <el-form-item label="备注说明/NPD Remark" style="display: block;"><el-input type="textarea" :rows="3" :value="currentRow.npdRemark || ''" disabled resize="none" style="width: 804px;height: 30px"></el-input></el-form-item>
  1455. </el-form>
  1456. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 50px">
  1457. <el-form-item label="内部TDS/Inner TDS" style="display: block;">
  1458. <oss-components
  1459. ref="bottomTdsOss"
  1460. :save-visible="authFileSave"
  1461. :edit-visible="false"
  1462. :download-visible="authFileDownLoad"
  1463. :remove-visible="authFileRemove"
  1464. :preview-visible="authFilePreview"
  1465. :disabled="true"
  1466. label="序列号"
  1467. :height="180"
  1468. style="margin-top: 2px"
  1469. :columns="tdsFileColumnList"
  1470. :order-ref1="currentRow.site || ''"
  1471. :order-ref2="currentRow.referenceNo || ''"
  1472. order-ref3="tdsProperty">
  1473. </oss-components>
  1474. </el-form-item>
  1475. </el-form>
  1476. </div>
  1477. </el-tab-pane>
  1478. <el-tab-pane label="HSF 填写信息" name="hsfInfo">
  1479. <div :style="{height: secondHeight + 'px'}" style="margin-left: 5px;margin-top: 5px; overflow-y: auto;">
  1480. <el-form :inline="true" label-position="top" :model="currentRow">
  1481. <el-form-item label="报告日期/Report Date">
  1482. <el-date-picker :value="currentRow.expiredDate" disabled type="date" value-format="yyyy-MM-dd" style="width: 150px"></el-date-picker>
  1483. </el-form-item>
  1484. <el-form-item label="有效期数值/Valid Until Value">
  1485. <el-input :value="currentRow.validUntilValue || ''" disabled style="width: 150px"></el-input>
  1486. </el-form-item>
  1487. <el-form-item label="有效期单位/Valid Until Unit">
  1488. <el-input :value="currentRow.validUntil || ''" disabled style="width: 150px"></el-input>
  1489. </el-form-item>
  1490. <el-form-item label="失效日期/Expiry Date">
  1491. <el-date-picker :value="currentRow.expiryDate" disabled type="date" value-format="yyyy-MM-dd" style="width: 150px"></el-date-picker>
  1492. </el-form-item>
  1493. <el-form-item label="状态/Status">
  1494. <el-input :value="currentRow.rohsStatus || ''" disabled style="width: 150px"></el-input>
  1495. </el-form-item>
  1496. </el-form>
  1497. <el-form :inline="true" label-position="top" :model="currentRow">
  1498. <el-form-item label="是否符合RoHS/Meet RoHS Req">
  1499. <el-radio-group :value="currentRow.isMeetRohsRequirement" disabled style="width: 190px">
  1500. <el-radio label="Y"></el-radio>
  1501. <el-radio label="N"></el-radio>
  1502. </el-radio-group>
  1503. </el-form-item>
  1504. <el-form-item label=" ">
  1505. <el-checkbox
  1506. :value="currentRow.isAhGrade"
  1507. true-label="Y"
  1508. false-label="N"
  1509. disabled
  1510. style="width: 190px">材料属性是否是AH/Is AH Grade</el-checkbox>
  1511. </el-form-item>
  1512. <el-form-item label="HSF供应商等级/Supplier Class">
  1513. <el-radio-group :value="currentRow.hsfSupplierClassification" disabled style="width: 260px">
  1514. <el-radio label="高风险">高风险</el-radio>
  1515. <el-radio label="中风险">中风险</el-radio>
  1516. <el-radio label="低风险">低风险</el-radio>
  1517. </el-radio-group>
  1518. </el-form-item>
  1519. </el-form>
  1520. <el-form :inline="true" label-position="top" :model="currentRow">
  1521. <el-form-item label="Fiber报告信息/Fiber Information" style="display: block;"><el-input type="textarea" :rows="3" :value="currentRow.fiberInformation || ''" disabled resize="none" style="width: 804px;height: 30px"></el-input></el-form-item>
  1522. </el-form>
  1523. <el-form :inline="true" label-position="top" :model="currentRow" style="margin-top: 45px">
  1524. <el-form-item label="HSF审批人/HSF Approver"><el-input :value="currentRow.hsfApproverName || currentRow.hsfApprover || ''" disabled style="width: 396px"></el-input></el-form-item>
  1525. <el-form-item label="Inform Related people"><el-input :value="currentRow.relatedPeopleName || currentRow.relatedPeople || ''" disabled style="width: 396px"></el-input></el-form-item>
  1526. </el-form>
  1527. <el-form v-if="shouldShowHsfStandard(currentRow.endCustomer)" :inline="true" label-position="top" :model="currentRow" style="margin-top: 0px">
  1528. <el-form-item label="HSF标准/HSF Standard" style="display: block;"><el-input type="textarea" :rows="3" :value="currentRow.hsfStandard || ''" disabled resize="none" style="width: 804px;height: 30px"></el-input></el-form-item>
  1529. </el-form>
  1530. </div>
  1531. </el-tab-pane>
  1532. <el-tab-pane label="材料信息" name="materialInfo">
  1533. <div :style="{height: secondHeight + 'px'}" style="overflow-y: auto;">
  1534. <el-table
  1535. class="rohs-material-table"
  1536. border
  1537. :data="currentRow.materialList || []"
  1538. :height="secondHeight"
  1539. style="width: 100%">
  1540. <el-table-column type="index" label="序号" width="50" header-align="center" align="center"></el-table-column>
  1541. <el-table-column prop="finalPartNo" label="IFS物料编码/Final Part No." min-width="150" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  1542. <el-table-column prop="partDesc" label="描述/Part Desc." min-width="250" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  1543. <el-table-column prop="partStatus" label="状态/Part Status" min-width="100" header-align="center" align="left" :show-overflow-tooltip="true"></el-table-column>
  1544. </el-table>
  1545. </div>
  1546. </el-tab-pane>
  1547. <el-tab-pane label="附件信息" name="attachment">
  1548. <oss-components
  1549. ref="bottomAttachmentOss"
  1550. :save-visible="authFileSave"
  1551. :edit-visible="authFileSave"
  1552. :download-visible="authFileDownLoad"
  1553. :remove-visible="authFileRemove"
  1554. :preview-visible="authFilePreview"
  1555. :disabled="currentRow.status === '已完成'"
  1556. :show-order-ref3-filter="true"
  1557. :order-ref3-filter-options="rohsAttachmentTypeOptionList"
  1558. :query-order-ref3-list="rohsAttachmentQueryOrderRef3List"
  1559. :order-ref3-filter-query-map="rohsAttachmentTypeFilterQueryMap"
  1560. :order-ref3-label-map="rohsAttachmentTypeLabelMap"
  1561. label="序列号"
  1562. :height="secondHeight - 25"
  1563. style="margin-top: 2px"
  1564. :columns="rohsAttachmentSummaryColumnList"
  1565. :order-ref1="currentRow.site"
  1566. :order-ref2="currentRow.referenceNo">
  1567. </oss-components>
  1568. </el-tab-pane>
  1569. <el-tab-pane label="审批信息" name="approvalInformation">
  1570. <approval-information v-model:data-list="approvalList" :height="secondHeight"></approval-information>
  1571. </el-tab-pane>
  1572. </el-tabs>
  1573. <ChooseList ref="baseList" @getBaseData="getBaseData"></ChooseList>
  1574. <filter-search :visible.sync="filterVisible" @search="queryByAnyField"></filter-search>
  1575. </div>
  1576. </template>
  1577. <script>
  1578. import * as api from '@/api/rohs/rohs'
  1579. import { checkSuperAdmin } from "@/api/changeManagement/changeManagement"
  1580. import { verifyData } from "@/api/chooselist/chooselist.js"
  1581. import { searchProjectInfoList } from "@/api/quotation/quotationInformation.js"
  1582. import { queryCustomer } from "@/api/customer/customerInformation"
  1583. import { queryProjectByCustomer } from "@/api/project/project"
  1584. import { createOfficialPartForRohs, getNextPartNo as getPartNextPartNo, getItemListByCodeNo as getPartItemListByCodeNo, getItemExclusionAlreadyExists as getPartItemExclusionAlreadyExists } from "@/api/part/partInformation.js"
  1585. import uploadFileList from '../common/uploadFileList'
  1586. import ossComponents from '../oss/ossComponents.vue'
  1587. import ChooseList from '@/views/modules/common/Chooselist'
  1588. import DictDataSelect from "../sys/dict-data-select.vue"
  1589. import ApprovalInformation from "../changeManagement/approvalInformation.vue"
  1590. import FilterSearch from "../../common/filterSearch.vue"
  1591. export default {
  1592. components: {
  1593. uploadFileList,
  1594. ossComponents,
  1595. ChooseList,
  1596. DictDataSelect,
  1597. ApprovalInformation,
  1598. FilterSearch
  1599. },
  1600. data () {
  1601. return {
  1602. searchData: {
  1603. site: this.$store.state.user.site,
  1604. referenceNo: '',
  1605. status: '',
  1606. rohsStatus: '',
  1607. currentApprover: '',
  1608. nodeId: ''
  1609. },
  1610. exportLoading: false,
  1611. exportData: [],
  1612. exportFieldMap: {},
  1613. exportName: '',
  1614. exportHeader: ['RoHs记录'],
  1615. exportFooter: [],
  1616. resultList: [],
  1617. dataList: [],
  1618. pageIndex: 1,
  1619. pageSize: 20,
  1620. totalPage: 0,
  1621. dataListLoading: false,
  1622. activeTable: 'basicInfo',
  1623. menuId: '112001',
  1624. authSearch: false,
  1625. authUpdate: false,
  1626. authIssue: false,
  1627. authSubmit: false,
  1628. authReject: false,
  1629. authFileSave: false,
  1630. authFileDownLoad: false,
  1631. authFileRemove: false,
  1632. authFilePreview: false,
  1633. authDataEntry: false,
  1634. authMaterialDescRemark: false,
  1635. authDelete: false,
  1636. superAdmin: false,
  1637. createBy2: this.$store.state.user.name,
  1638. height: 400,
  1639. secondHeight: 200,
  1640. currentRow: {},
  1641. fileColumnList: [
  1642. {
  1643. columnProp: 'fileName',
  1644. headerAlign: 'center',
  1645. align: 'center',
  1646. columnLabel: '文件名称',
  1647. columnHidden: false,
  1648. columnImage: false,
  1649. columnSortable: false,
  1650. status: true,
  1651. fixed: '',
  1652. columnWidth: 140
  1653. },
  1654. {
  1655. columnProp: 'fileRemark',
  1656. headerAlign: 'center',
  1657. align: 'center',
  1658. columnLabel: '备注',
  1659. columnHidden: false,
  1660. columnImage: false,
  1661. columnSortable: false,
  1662. status: true,
  1663. fixed: '',
  1664. columnWidth: 200
  1665. },
  1666. {
  1667. columnProp: 'createDate',
  1668. headerAlign: 'center',
  1669. align: 'center',
  1670. columnLabel: '上传时间',
  1671. columnHidden: false,
  1672. columnImage: false,
  1673. columnSortable: false,
  1674. status: true,
  1675. fixed: '',
  1676. columnWidth: 150
  1677. },
  1678. {
  1679. columnProp: 'createBy',
  1680. headerAlign: 'center',
  1681. align: 'center',
  1682. columnLabel: '上传人',
  1683. columnHidden: false,
  1684. columnImage: false,
  1685. columnSortable: false,
  1686. status: true,
  1687. fixed: '',
  1688. columnWidth: 120
  1689. }
  1690. ],
  1691. rohsAttachmentTypeOptionList: [
  1692. { value: 'rohsAttachmentTds', label: 'TDS' },
  1693. { value: 'rohsAttachmentMsds', label: 'MSDS' },
  1694. { value: 'rohsAttachmentTestReport', label: '测试报告' },
  1695. { value: 'rohsAttachmentOther', label: 'Other' }
  1696. ],
  1697. rohsAttachmentTypeLabelMap: {
  1698. rohsAttachmentTds: 'TDS',
  1699. rohsAttachmentMsds: 'MSDS',
  1700. rohsAttachmentTestReport: '测试报告',
  1701. rohsAttachmentOther: 'Other',
  1702. rohsAttachment: 'Other'
  1703. },
  1704. rohsAttachmentQueryOrderRef3List: [
  1705. 'rohsAttachmentTds',
  1706. 'rohsAttachmentMsds',
  1707. 'rohsAttachmentTestReport',
  1708. 'rohsAttachmentOther',
  1709. 'rohsAttachment'
  1710. ],
  1711. rohsAttachmentTypeFilterQueryMap: {
  1712. rohsAttachmentTds: ['rohsAttachmentTds'],
  1713. rohsAttachmentMsds: ['rohsAttachmentMsds'],
  1714. rohsAttachmentTestReport: ['rohsAttachmentTestReport'],
  1715. rohsAttachmentOther: ['rohsAttachmentOther', 'rohsAttachment']
  1716. },
  1717. rohsAttachmentSummaryColumnList: [
  1718. {
  1719. columnProp: 'orderRef3Label',
  1720. headerAlign: 'center',
  1721. align: 'center',
  1722. columnLabel: '类型',
  1723. columnHidden: false,
  1724. columnImage: false,
  1725. columnSortable: false,
  1726. status: true,
  1727. fixed: '',
  1728. columnWidth: 120
  1729. },
  1730. {
  1731. columnProp: 'fileName',
  1732. headerAlign: 'center',
  1733. align: 'center',
  1734. columnLabel: '文件名称',
  1735. columnHidden: false,
  1736. columnImage: false,
  1737. columnSortable: false,
  1738. status: true,
  1739. fixed: '',
  1740. columnWidth: 160
  1741. },
  1742. {
  1743. columnProp: 'fileRemark',
  1744. headerAlign: 'center',
  1745. align: 'center',
  1746. columnLabel: '备注',
  1747. columnHidden: false,
  1748. columnImage: false,
  1749. columnSortable: false,
  1750. status: true,
  1751. fixed: '',
  1752. columnWidth: 220
  1753. },
  1754. {
  1755. columnProp: 'createDate',
  1756. headerAlign: 'center',
  1757. align: 'center',
  1758. columnLabel: '上传时间',
  1759. columnHidden: false,
  1760. columnImage: false,
  1761. columnSortable: false,
  1762. status: true,
  1763. fixed: '',
  1764. columnWidth: 160
  1765. },
  1766. {
  1767. columnProp: 'createBy',
  1768. headerAlign: 'center',
  1769. align: 'center',
  1770. columnLabel: '上传人',
  1771. columnHidden: false,
  1772. columnImage: false,
  1773. columnSortable: false,
  1774. status: true,
  1775. fixed: '',
  1776. columnWidth: 120
  1777. }
  1778. ],
  1779. tdsFileColumnList: [
  1780. {
  1781. columnProp: 'fileNo',
  1782. headerAlign: 'center',
  1783. align: 'center',
  1784. columnLabel: '文件编码',
  1785. columnHidden: false,
  1786. columnImage: false,
  1787. columnSortable: false,
  1788. status: true,
  1789. fixed: '',
  1790. columnWidth: 130
  1791. },
  1792. {
  1793. columnProp: 'rev',
  1794. headerAlign: 'center',
  1795. align: 'center',
  1796. columnLabel: '版本号',
  1797. columnHidden: false,
  1798. columnImage: false,
  1799. columnSortable: false,
  1800. status: true,
  1801. fixed: '',
  1802. columnWidth: 90
  1803. },
  1804. {
  1805. columnProp: 'fileName',
  1806. headerAlign: 'center',
  1807. align: 'center',
  1808. columnLabel: '文件名称',
  1809. columnHidden: false,
  1810. columnImage: false,
  1811. columnSortable: false,
  1812. status: true,
  1813. fixed: '',
  1814. columnWidth: 160
  1815. },
  1816. {
  1817. columnProp: 'fileRemark',
  1818. headerAlign: 'center',
  1819. align: 'center',
  1820. columnLabel: '备注',
  1821. columnHidden: false,
  1822. columnImage: false,
  1823. columnSortable: false,
  1824. status: true,
  1825. fixed: '',
  1826. columnWidth: 180
  1827. },
  1828. {
  1829. columnProp: 'createDate',
  1830. headerAlign: 'center',
  1831. align: 'center',
  1832. columnLabel: '上传时间',
  1833. columnHidden: false,
  1834. columnImage: false,
  1835. columnSortable: false,
  1836. status: true,
  1837. fixed: '',
  1838. columnWidth: 150
  1839. },
  1840. {
  1841. columnProp: 'invalidationTime',
  1842. headerAlign: 'center',
  1843. align: 'center',
  1844. columnLabel: '失效时间',
  1845. columnHidden: false,
  1846. columnImage: false,
  1847. columnSortable: false,
  1848. status: true,
  1849. fixed: '',
  1850. columnWidth: 150
  1851. },
  1852. {
  1853. columnProp: 'createBy',
  1854. headerAlign: 'center',
  1855. align: 'center',
  1856. columnLabel: '上传人',
  1857. columnHidden: false,
  1858. columnImage: false,
  1859. columnSortable: false,
  1860. status: true,
  1861. fixed: '',
  1862. columnWidth: 120
  1863. }
  1864. ],
  1865. modalFlag: false,
  1866. chooseProjectListFlag: false,
  1867. projectMaterialDialogFlag: false,
  1868. rohsCreatePartDialogFlag: false,
  1869. rohsCreatePartLoading: false,
  1870. rohsCreatePartTab: 'General',
  1871. rohsCreatePartTagNo: 0,
  1872. rohsCharacteristicDialogFlag: false,
  1873. rohsCharacteristicQueryData: {
  1874. propertiesItemNo: '',
  1875. itemDesc: ''
  1876. },
  1877. rohsCharacteristicList: [],
  1878. rohsCharacteristicSelections: [],
  1879. rohsPartItemSelections: [],
  1880. rohsCreatePartColumnItemList: [
  1881. {
  1882. columnProp: 'propertiesItemNo',
  1883. headerAlign: 'center',
  1884. align: 'left',
  1885. columnLabel: '属性编码',
  1886. columnHidden: false,
  1887. columnImage: false,
  1888. status: true,
  1889. fixed: '',
  1890. columnWidth: 100
  1891. },
  1892. {
  1893. columnProp: 'itemDesc',
  1894. headerAlign: 'center',
  1895. align: 'left',
  1896. columnLabel: '属性名称',
  1897. columnHidden: false,
  1898. columnImage: false,
  1899. status: true,
  1900. fixed: '',
  1901. columnWidth: 150
  1902. },
  1903. {
  1904. columnProp: 'valueType',
  1905. headerAlign: 'center',
  1906. align: 'center',
  1907. columnLabel: '属性类型',
  1908. columnHidden: false,
  1909. columnImage: false,
  1910. status: true,
  1911. fixed: '',
  1912. columnWidth: 60
  1913. },
  1914. {
  1915. columnProp: 'textValue',
  1916. headerAlign: 'center',
  1917. align: 'left',
  1918. columnLabel: '属性值',
  1919. columnHidden: false,
  1920. columnImage: false,
  1921. status: true,
  1922. fixed: '',
  1923. columnWidth: 140
  1924. }
  1925. ],
  1926. rohsCharacteristicColumnList: [
  1927. {
  1928. columnProp: 'propertiesItemNo',
  1929. headerAlign: 'center',
  1930. align: 'left',
  1931. columnLabel: '属性编码',
  1932. columnHidden: false,
  1933. columnImage: false,
  1934. status: true,
  1935. fixed: '',
  1936. columnWidth: 100
  1937. },
  1938. {
  1939. columnProp: 'itemDesc',
  1940. headerAlign: 'center',
  1941. align: 'left',
  1942. columnLabel: '属性名称',
  1943. columnHidden: false,
  1944. columnImage: false,
  1945. status: true,
  1946. fixed: '',
  1947. columnWidth: 200
  1948. },
  1949. {
  1950. columnProp: 'valueType',
  1951. headerAlign: 'center',
  1952. align: 'center',
  1953. columnLabel: '属性类型',
  1954. columnHidden: false,
  1955. columnImage: false,
  1956. status: true,
  1957. fixed: '',
  1958. columnWidth: 60
  1959. }
  1960. ],
  1961. rohsCreatePartData: {
  1962. site: '',
  1963. partNo: '',
  1964. partDesc: '',
  1965. partType: 'Purchased',
  1966. hazardCode: '',
  1967. hazardDesc: '',
  1968. familyId: '',
  1969. familyName: '',
  1970. groupId: '',
  1971. groupName: '',
  1972. umId: '',
  1973. umName: '',
  1974. weightNet: '',
  1975. uomForWeightNet: 'kg',
  1976. volumeNet: '',
  1977. uomForVolumeNet: 'm3',
  1978. lotTrackingCode: 'Order Based',
  1979. remark: '',
  1980. productGroupId1: '',
  1981. productGroupName1: '',
  1982. productGroupId2: '',
  1983. productGroupName2: '',
  1984. productGroupId3: '',
  1985. productGroupName3: '',
  1986. productGroupId4: '*',
  1987. productGroupName4: 'NorthSky Application owner',
  1988. commGroup3: '',
  1989. commGroup3Desc: '',
  1990. codeNo: '',
  1991. codeDesc: '',
  1992. typeDesignation: '',
  1993. assetClass: 'S',
  1994. assetClassDesc: '标准',
  1995. dimQuality: '',
  1996. abcClass: 'C',
  1997. abcClassDesc: '',
  1998. frequencyClass: 'Very Slow Mover',
  1999. lifecycleStage: 'Development',
  2000. countryOfOrigin: '',
  2001. countryOfOriginDesc: '',
  2002. regionOfOrigin: '',
  2003. regionOfOriginDesc: '',
  2004. manufacturingLeadTime: 0,
  2005. expectedLeadTime: 0,
  2006. durabilityWeek: '',
  2007. durabilityDay: '',
  2008. intrastatConvFactor: undefined,
  2009. customsStatNo: '',
  2010. customsStatDesc: '',
  2011. umDesc: '',
  2012. planningMethod: 'A',
  2013. planningMethodDesc: '',
  2014. partStatus: 'A',
  2015. partStatusDesc: '活动',
  2016. active: 'Y',
  2017. status: 'Y',
  2018. supplyCode: 'Inventory Order',
  2019. configurationId: '*',
  2020. partCostGroupId: '',
  2021. partCostGroupDesc: '',
  2022. inventoryValuationMethod: 'Standard Cost',
  2023. inventoryPartCostLevel: 'Cost Per Part',
  2024. invoiceConsideration: 'Ignore Invoice Price',
  2025. zeroCostFlag: 'Zero Cost Forbidden',
  2026. estimatedMaterialCost: 0,
  2027. safetyStock: 0,
  2028. minOrderQty: 0,
  2029. maxOrderQty: 0,
  2030. mulOrderQty: 0,
  2031. safetyLeadTime: 0,
  2032. shrinkageFac: 0,
  2033. stdOrderQty: 0,
  2034. cumLeadTime: 0,
  2035. byProdAsSupplyInMrpDb: '',
  2036. unprotectedLeadTime: 0,
  2037. backFlushPart: 'All Locations',
  2038. issueType: 'Reserve And Backflush',
  2039. mrpControlFlagDb: 'Y',
  2040. fixedLeadTimeDay: 0,
  2041. overReporting: 'Allowed',
  2042. useTheoreticalDensityDb: '',
  2043. variableLeadTimeDay: 0,
  2044. overReportTolerance: 0,
  2045. fixedLeadTimeHour: 0,
  2046. density: undefined,
  2047. variableLeadTimeHour: 0,
  2048. showInQueryFlag: 'Y',
  2049. temporaryPartFlag: 'N',
  2050. partItemList: []
  2051. },
  2052. searchProjectData: {
  2053. site: '',
  2054. projectId: undefined,
  2055. projectName: undefined,
  2056. customerId: undefined,
  2057. },
  2058. projectMaterialSearchData: {
  2059. finalPartNo: '',
  2060. partDesc: '',
  2061. partStatus: ''
  2062. },
  2063. projectMaterialList: [],
  2064. projectMaterialSelections: [],
  2065. dataListSelections: [],
  2066. materialSelections: [],
  2067. projectMaterialPageIndex: 1,
  2068. projectMaterialPageSize: 20,
  2069. projectMaterialTotal: 0,
  2070. projectMaterialLoading: false,
  2071. nodeOptions: [],
  2072. projectList: [],
  2073. hsfApproverOptionList: [],
  2074. hsfApproverDisplayList: [],
  2075. hsfApproverSelectionCache: [],
  2076. hsfApproverFlag: false,
  2077. hsfApproverSearchData: {
  2078. operatorId: '',
  2079. operatorName: ''
  2080. },
  2081. relatedPeopleOptionList: [],
  2082. relatedPeopleDisplayList: [],
  2083. relatedPeopleSelection: null,
  2084. relatedPeopleFlag: false,
  2085. relatedPeopleSearchData: {
  2086. operatorId: '',
  2087. operatorName: ''
  2088. },
  2089. filterVisible: false,
  2090. isFilterSearch: false,
  2091. filterSearchData: {},
  2092. approvalList: [],
  2093. plmRohsAuthorityArr: [],
  2094. nodeAuthorityLoaded: false,
  2095. isEditMode: false,
  2096. modalTitle: 'RoHS 新增',
  2097. activeName: 'basicInfo',
  2098. showModalFlag: false,
  2099. submitModalFlag: false,
  2100. rohsRemarkFlag: false,
  2101. rohsMaterialDescFlag: false,
  2102. rejectOpinion: '',
  2103. submitLoading: false,
  2104. rohsRemarkForm: {
  2105. remark: ''
  2106. },
  2107. rohsMaterialDescForm: {
  2108. materialDesc: ''
  2109. },
  2110. hsfStandardDefaultText: 'With the follow environmental specification: Macallan regulated Substances specification(069-0135) /Macallan sustainable fiber specification(099-00532)',
  2111. modalData: {
  2112. site: 'DEFAULT',
  2113. referenceNo: '',
  2114. applicant: '',
  2115. pm: '',
  2116. pmName: '',
  2117. applicationDate: '',
  2118. process: '',
  2119. plannedMassProductionDate: '',
  2120. color: '',
  2121. vendorCode: '',
  2122. vendorMaterialCode: '',
  2123. materialClassify: '',
  2124. otherMaterialClassify: '',
  2125. materialUseFor: '',
  2126. endCustomer: '',
  2127. projectId: '',
  2128. commGroup1: '',
  2129. commGroup1Desc: '',
  2130. commGroup2: '',
  2131. commGroup2Desc: '',
  2132. commGroup3: '',
  2133. commGroup3Desc: '',
  2134. needCreateNumber: '',
  2135. npdEngineer: '',
  2136. materialValidityTime: '',
  2137. materialValidityComments: '',
  2138. needDeviation: '',
  2139. technicalPlan: '',
  2140. wmRequiredSpec: '',
  2141. isFiberMaterial: '',
  2142. materialThickness: '',
  2143. buyer: '',
  2144. expectReportTime: '',
  2145. qualificationDocumentsNeeded: '',
  2146. qualificationDocumentsNeededList: [],
  2147. testReportIncludingItems: '',
  2148. testReportIncludingItemsList: [],
  2149. remark: '',
  2150. status: '',
  2151. sgsReportNumber: '',
  2152. rohsStatus: 'Active',
  2153. expiredDate: '',
  2154. expiryDate: '',
  2155. fiberInformation: '',
  2156. hsfStandard: '',
  2157. hsfApprover: '',
  2158. hsfApproverName: '',
  2159. hsfApproverCodeList: [],
  2160. relatedPeople: '',
  2161. relatedPeopleName: '',
  2162. buNo: '',
  2163. validUntilValue: 0,
  2164. validUntil: '',
  2165. isMeetRohsRequirement: '',
  2166. isAhGrade: 'N',
  2167. hsfSupplierClassification: '',
  2168. materialDesc: '',
  2169. npdRemark: '',
  2170. isSameMaterialDiffSize: '',
  2171. ifsPartNo: '',
  2172. materialList: [],
  2173. stepId: null,
  2174. rejectFlag: '',
  2175. rejectStepId: null,
  2176. createBy2: '',
  2177. isReject: 'Y',
  2178. tpProcessControl: 'N',
  2179. csProcessControl: 'N'
  2180. }
  2181. }
  2182. },
  2183. created () {
  2184. this.menuId = (this.$route.meta && this.$route.meta.menuId) || this.menuId || '112001'
  2185. this.getButtonAuthData()
  2186. this.checkSuperAdmin()
  2187. },
  2188. mounted () {
  2189. this.fetchNodeOptions()
  2190. if (this.authSearch) {
  2191. this.getDataList()
  2192. }
  2193. this.$nextTick(() => {
  2194. this.height = window.innerHeight / 2 - 30
  2195. /*第二个表格高度的动态调整*/
  2196. this.secondHeight = window.innerHeight / 2 - 186
  2197. })
  2198. },
  2199. watch: {
  2200. activeName (val) {
  2201. if (val === 'attachmentInfo' || val === 'npdInfo') {
  2202. this.$nextTick(() => {
  2203. if (val === 'attachmentInfo') {
  2204. this.refreshOssRef('modalAttachmentTdsOss')
  2205. this.refreshOssRef('modalAttachmentMsdsOss')
  2206. this.refreshOssRef('modalAttachmentTestReportOss')
  2207. this.refreshOssRef('modalAttachmentOtherOss')
  2208. }
  2209. if (val === 'npdInfo') {
  2210. this.refreshOssRef('modalTdsOss')
  2211. }
  2212. })
  2213. }
  2214. },
  2215. 'modalData.expiredDate' () {
  2216. this.syncExpiryDateByRule()
  2217. },
  2218. 'modalData.validUntilValue' () {
  2219. this.syncExpiryDateByRule()
  2220. },
  2221. 'modalData.validUntil' () {
  2222. this.syncExpiryDateByRule()
  2223. },
  2224. 'modalData.endCustomer' () {
  2225. this.applyHsfStandardDefaultByCustomer(this.modalData)
  2226. }
  2227. },
  2228. methods: {
  2229. fetchNodeOptions () {
  2230. if (!this.searchData.site || !this.menuId) {
  2231. this.nodeOptions = []
  2232. return
  2233. }
  2234. let params = {
  2235. site: this.searchData.site,
  2236. menuId: this.menuId
  2237. }
  2238. api.getNodeList(params).then(({data}) => {
  2239. if (data && data.code === 0 && Array.isArray(data.rows)) {
  2240. this.nodeOptions = data.rows
  2241. .filter(item => item && item.nodeId)
  2242. .map(item => ({
  2243. id: item.nodeId,
  2244. name: item.nodeName
  2245. }))
  2246. } else {
  2247. this.nodeOptions = []
  2248. }
  2249. }).catch(() => {
  2250. this.nodeOptions = []
  2251. })
  2252. },
  2253. loadNodeAuthority (site, stepId) {
  2254. if (!site || stepId === null || stepId === undefined || !this.menuId) {
  2255. this.plmRohsAuthorityArr = []
  2256. this.nodeAuthorityLoaded = true
  2257. return Promise.resolve()
  2258. }
  2259. this.nodeAuthorityLoaded = false
  2260. let params = {
  2261. site: site,
  2262. stepId: stepId,
  2263. menuId: this.menuId
  2264. }
  2265. return api.getRohsNodeAuthority(params).then(({data}) => {
  2266. if (data && data.code === 0 && data.rows) {
  2267. this.plmRohsAuthorityArr = data.rows.plm_rohs || []
  2268. } else {
  2269. this.plmRohsAuthorityArr = []
  2270. }
  2271. this.nodeAuthorityLoaded = true
  2272. }).catch(() => {
  2273. this.plmRohsAuthorityArr = []
  2274. this.nodeAuthorityLoaded = true
  2275. })
  2276. },
  2277. rohsFieldFlag (fieldId) {
  2278. if (!this.plmRohsAuthorityArr || this.plmRohsAuthorityArr.length === 0) {
  2279. return 'N'
  2280. }
  2281. let target = this.plmRohsAuthorityArr.find(item => item.fieldId === fieldId)
  2282. return target ? target.updateFlag : 'N'
  2283. },
  2284. isRohsFieldDisabled (fieldId) {
  2285. if (this.showModalFlag) {
  2286. return true
  2287. }
  2288. if (!this.isEditMode) {
  2289. return false
  2290. }
  2291. return this.rohsFieldFlag(fieldId) === 'N'
  2292. },
  2293. isProcessFieldDisabled () {
  2294. if (this.isEditMode) {
  2295. return true
  2296. }
  2297. return this.isRohsFieldDisabled('process')
  2298. },
  2299. handleProcessChange (value) {
  2300. const processValue = String(value || '').trim()
  2301. this.$set(this.modalData, 'process', processValue)
  2302. this.$set(this.modalData, 'buNo', processValue)
  2303. if (this.isEditMode) {
  2304. return
  2305. }
  2306. this.clearHsfApproverFields(false)
  2307. if (!processValue) {
  2308. return
  2309. }
  2310. this.loadHsfApproverByCurrentProcess(true)
  2311. },
  2312. isRohsFieldDisabledWithFallback (primaryFieldId, fallbackFieldId) {
  2313. if (this.showModalFlag) {
  2314. return true
  2315. }
  2316. if (!this.isEditMode) {
  2317. return false
  2318. }
  2319. const primaryDisabled = this.rohsFieldFlag(primaryFieldId) === 'N'
  2320. if (!primaryDisabled) {
  2321. return false
  2322. }
  2323. return this.rohsFieldFlag(fallbackFieldId) === 'N'
  2324. },
  2325. isValidUntilValueDisabled () {
  2326. return this.isRohsFieldDisabledWithFallback('validUntilValue', 'validUntil')
  2327. },
  2328. isValidUntilUnitDisabled () {
  2329. return this.isRohsFieldDisabledWithFallback('validUntil', 'validUntilValue')
  2330. },
  2331. canEditRohsMaterial () {
  2332. return !this.showModalFlag
  2333. },
  2334. normalizeDateOnly (value) {
  2335. if (value === null || value === undefined || value === '') {
  2336. return ''
  2337. }
  2338. if (value instanceof Date && !Number.isNaN(value.getTime())) {
  2339. const year = value.getFullYear()
  2340. const month = String(value.getMonth() + 1).padStart(2, '0')
  2341. const day = String(value.getDate()).padStart(2, '0')
  2342. return year + '-' + month + '-' + day
  2343. }
  2344. const text = String(value).trim()
  2345. if (!text) {
  2346. return ''
  2347. }
  2348. if (text.includes('T')) {
  2349. return text.split('T')[0]
  2350. }
  2351. return text.length >= 10 ? text.substring(0, 10) : text
  2352. },
  2353. parseDateOnly (value) {
  2354. const text = this.normalizeDateOnly(value)
  2355. if (!text) {
  2356. return null
  2357. }
  2358. const parts = text.split('-')
  2359. if (parts.length !== 3) {
  2360. return null
  2361. }
  2362. const year = Number.parseInt(parts[0], 10)
  2363. const month = Number.parseInt(parts[1], 10)
  2364. const day = Number.parseInt(parts[2], 10)
  2365. if (Number.isNaN(year) || Number.isNaN(month) || Number.isNaN(day)) {
  2366. return null
  2367. }
  2368. const date = new Date(year, month - 1, day)
  2369. if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
  2370. return null
  2371. }
  2372. return date
  2373. },
  2374. normalizeValidUntilUnitType (unitValue) {
  2375. const text = String(unitValue || '').trim().toLowerCase()
  2376. if (!text) {
  2377. return ''
  2378. }
  2379. if (text === 'd' || text === 'day' || text === 'days' || text.includes('日')) {
  2380. return 'day'
  2381. }
  2382. if (text === 'w' || text === 'week' || text === 'weeks' || text.includes('周')) {
  2383. return 'week'
  2384. }
  2385. if (text === 'm' || text === 'month' || text === 'months' || text.includes('月')) {
  2386. return 'month'
  2387. }
  2388. if (text === 'y' || text === 'year' || text === 'years' || text.includes('年')) {
  2389. return 'year'
  2390. }
  2391. return ''
  2392. },
  2393. addMonthsKeepDay (baseDate, monthDelta) {
  2394. const year = baseDate.getFullYear()
  2395. const month = baseDate.getMonth()
  2396. const day = baseDate.getDate()
  2397. const targetFirstDay = new Date(year, month + monthDelta, 1)
  2398. const targetYear = targetFirstDay.getFullYear()
  2399. const targetMonth = targetFirstDay.getMonth()
  2400. const lastDay = new Date(targetYear, targetMonth + 1, 0).getDate()
  2401. return new Date(targetYear, targetMonth, Math.min(day, lastDay))
  2402. },
  2403. addYearsKeepDay (baseDate, yearDelta) {
  2404. const targetYear = baseDate.getFullYear() + yearDelta
  2405. const month = baseDate.getMonth()
  2406. const day = baseDate.getDate()
  2407. const lastDay = new Date(targetYear, month + 1, 0).getDate()
  2408. return new Date(targetYear, month, Math.min(day, lastDay))
  2409. },
  2410. calculateExpiryDateByRule (reportDate, validUntilValue, validUntilUnit) {
  2411. const baseDate = this.parseDateOnly(reportDate)
  2412. const durationValue = this.normalizeValidUntilValue(validUntilValue)
  2413. const unitType = this.normalizeValidUntilUnitType(validUntilUnit)
  2414. if (!baseDate || !durationValue || !unitType) {
  2415. return ''
  2416. }
  2417. let resultDate = new Date(baseDate.getTime())
  2418. if (unitType === 'day') {
  2419. resultDate.setDate(resultDate.getDate() + durationValue)
  2420. } else if (unitType === 'week') {
  2421. resultDate.setDate(resultDate.getDate() + durationValue * 7)
  2422. } else if (unitType === 'month') {
  2423. resultDate = this.addMonthsKeepDay(baseDate, durationValue)
  2424. } else if (unitType === 'year') {
  2425. resultDate = this.addYearsKeepDay(baseDate, durationValue)
  2426. } else {
  2427. return ''
  2428. }
  2429. return this.normalizeDateOnly(resultDate)
  2430. },
  2431. syncExpiryDateByRule () {
  2432. if (!this.modalData) {
  2433. return ''
  2434. }
  2435. const expiryDate = this.calculateExpiryDateByRule(this.modalData.expiredDate, this.modalData.validUntilValue, this.modalData.validUntil)
  2436. this.$set(this.modalData, 'expiryDate', expiryDate)
  2437. return expiryDate
  2438. },
  2439. getCurrentDateString () {
  2440. return this.normalizeDateOnly(new Date())
  2441. },
  2442. normalizeCheckboxFlag (value) {
  2443. return String(value || '').trim().toUpperCase() === 'Y' ? 'Y' : 'N'
  2444. },
  2445. normalizeValidUntilValue (value) {
  2446. if (value === null || value === undefined || value === '') {
  2447. return null
  2448. }
  2449. const parsed = Number.parseInt(value, 10)
  2450. if (Number.isNaN(parsed) || parsed <= 0) {
  2451. return null
  2452. }
  2453. return parsed
  2454. },
  2455. getValidUntilDisplay (value, unit) {
  2456. const normalizedValue = this.normalizeValidUntilValue(value)
  2457. const normalizedUnit = String(unit || '').trim()
  2458. if (normalizedValue && normalizedUnit) {
  2459. return normalizedValue + normalizedUnit
  2460. }
  2461. if (normalizedValue) {
  2462. return String(normalizedValue)
  2463. }
  2464. return normalizedUnit
  2465. },
  2466. getRohsSubmitFieldValue (fieldId) {
  2467. const fieldMapping = {
  2468. materialClassify: 'materialClassifyList',
  2469. qualificationDocumentsNeeded: 'qualificationDocumentsNeededList',
  2470. testReportIncludingItems: 'testReportIncludingItemsList',
  2471. hsfApprover: 'hsfApproverCodeList'
  2472. }
  2473. const mappedField = fieldMapping[fieldId]
  2474. if (mappedField) {
  2475. return this.modalData[mappedField]
  2476. }
  2477. return this.modalData[fieldId]
  2478. },
  2479. isSubmitFieldEmpty (value) {
  2480. if (Array.isArray(value)) {
  2481. return value.length === 0
  2482. }
  2483. if (typeof value === 'string') {
  2484. return value.trim() === ''
  2485. }
  2486. return !value
  2487. },
  2488. validateSubmitRequiredFields () {
  2489. if (this.plmRohsAuthorityArr && this.plmRohsAuthorityArr.length > 0) {
  2490. let validUntilPairRequiredChecked = false
  2491. for (let i = 0; i < this.plmRohsAuthorityArr.length; i++) {
  2492. const fieldConfig = this.plmRohsAuthorityArr[i]
  2493. if (fieldConfig.required !== 'Y') {
  2494. continue
  2495. }
  2496. if (fieldConfig.fieldId === 'hsfStandard' && !this.shouldShowHsfStandard(this.modalData.endCustomer)) {
  2497. continue
  2498. }
  2499. if (fieldConfig.fieldId === 'validUntil' || fieldConfig.fieldId === 'validUntilValue') {
  2500. if (validUntilPairRequiredChecked) {
  2501. continue
  2502. }
  2503. const validUntilValue = this.normalizeValidUntilValue(this.modalData.validUntilValue)
  2504. this.$set(this.modalData, 'validUntilValue', validUntilValue)
  2505. if (this.isSubmitFieldEmpty(validUntilValue) || this.isSubmitFieldEmpty(this.modalData.validUntil)) {
  2506. this.$message.warning('有效期数值/单位不能为空!')
  2507. return false
  2508. }
  2509. validUntilPairRequiredChecked = true
  2510. continue
  2511. }
  2512. const value = this.getRohsSubmitFieldValue(fieldConfig.fieldId)
  2513. if (this.isSubmitFieldEmpty(value)) {
  2514. this.$message.warning((fieldConfig.fieldName || fieldConfig.fieldId) + '不能为空!')
  2515. return false
  2516. }
  2517. }
  2518. }
  2519. return true
  2520. },
  2521. validateValidUntilPair () {
  2522. const validUntilValue = this.normalizeValidUntilValue(this.modalData.validUntilValue)
  2523. const validUntilUnit = String(this.modalData.validUntil || '').trim()
  2524. this.$set(this.modalData, 'validUntilValue', validUntilValue)
  2525. this.$set(this.modalData, 'validUntil', validUntilUnit)
  2526. if (!validUntilValue && !validUntilUnit) {
  2527. return true
  2528. }
  2529. if (!validUntilValue) {
  2530. this.$message.warning('请填写有效期数值')
  2531. return false
  2532. }
  2533. if (!validUntilUnit) {
  2534. this.$message.warning('请选择有效期单位')
  2535. return false
  2536. }
  2537. return true
  2538. },
  2539. materialDialogHeaderCellStyle () {
  2540. return {
  2541. whiteSpace: 'nowrap',
  2542. wordBreak: 'keep-all'
  2543. }
  2544. },
  2545. displayYesNo (value) {
  2546. if (value === 'Y') {
  2547. return '是'
  2548. }
  2549. if (value === 'N') {
  2550. return '否'
  2551. }
  2552. return value || ''
  2553. },
  2554. getMultipleSelectTitle (value) {
  2555. if (!Array.isArray(value)) {
  2556. return ''
  2557. }
  2558. return value
  2559. .filter(item => item !== null && item !== undefined && String(item).trim() !== '')
  2560. .map(item => String(item).trim())
  2561. .join(';')
  2562. },
  2563. shouldShowHsfStandard (customerCode) {
  2564. return String(customerCode || '').trim().toUpperCase() === 'C00052'
  2565. },
  2566. applyHsfStandardDefaultByCustomer (formData) {
  2567. if (!formData || !this.shouldShowHsfStandard(formData.endCustomer)) {
  2568. return
  2569. }
  2570. const currentValue = String(formData.hsfStandard || '').trim()
  2571. if (!currentValue) {
  2572. this.$set(formData, 'hsfStandard', this.hsfStandardDefaultText)
  2573. }
  2574. },
  2575. normalizeHsfStandardByCustomer (formData) {
  2576. if (!formData) {
  2577. return
  2578. }
  2579. if (!this.shouldShowHsfStandard(formData.endCustomer)) {
  2580. this.$set(formData, 'hsfStandard', '')
  2581. return
  2582. }
  2583. this.applyHsfStandardDefaultByCustomer(formData)
  2584. },
  2585. resolveOperatorNameById (operatorId) {
  2586. const normalizedId = String(operatorId || '').trim()
  2587. if (!normalizedId) {
  2588. return ''
  2589. }
  2590. const option = (this.hsfApproverOptionList || []).find(item => String(item.operatorId || '').trim() === normalizedId) ||
  2591. (this.relatedPeopleOptionList || []).find(item => String(item.operatorId || '').trim() === normalizedId)
  2592. return option ? String(option.operatorName || '').trim() : normalizedId
  2593. },
  2594. resolveOperatorIdByCodeOrName (operatorValue) {
  2595. const normalizedValue = String(operatorValue || '').trim()
  2596. if (!normalizedValue) {
  2597. return ''
  2598. }
  2599. const option = (this.hsfApproverOptionList || []).find(item => String(item.operatorId || '').trim() === normalizedValue) ||
  2600. (this.hsfApproverOptionList || []).find(item => String(item.operatorName || '').trim() === normalizedValue) ||
  2601. (this.relatedPeopleOptionList || []).find(item => String(item.operatorId || '').trim() === normalizedValue) ||
  2602. (this.relatedPeopleOptionList || []).find(item => String(item.operatorName || '').trim() === normalizedValue)
  2603. return option ? String(option.operatorId || '').trim() : normalizedValue
  2604. },
  2605. syncHsfApproverFields () {
  2606. const sourceList = Array.isArray(this.modalData.hsfApproverCodeList)
  2607. ? this.modalData.hsfApproverCodeList
  2608. : []
  2609. const uniqueCodeList = []
  2610. const seen = new Set()
  2611. sourceList.forEach(item => {
  2612. const value = this.resolveOperatorIdByCodeOrName(item)
  2613. if (!value || seen.has(value)) {
  2614. return
  2615. }
  2616. seen.add(value)
  2617. uniqueCodeList.push(value)
  2618. })
  2619. this.$set(this.modalData, 'hsfApproverCodeList', uniqueCodeList)
  2620. this.$set(this.modalData, 'hsfApprover', uniqueCodeList.join(';'))
  2621. this.$set(this.modalData, 'hsfApproverName', uniqueCodeList.map(item => this.resolveOperatorNameById(item)).join(';'))
  2622. this.buildRelatedPeopleOptions(uniqueCodeList)
  2623. const relatedPeopleCode = this.resolveOperatorIdByCodeOrName(this.modalData.relatedPeople)
  2624. if (relatedPeopleCode && !uniqueCodeList.includes(relatedPeopleCode)) {
  2625. this.$set(this.modalData, 'relatedPeople', '')
  2626. this.$set(this.modalData, 'relatedPeopleName', '')
  2627. return
  2628. }
  2629. if (relatedPeopleCode) {
  2630. this.$set(this.modalData, 'relatedPeople', relatedPeopleCode)
  2631. this.$set(this.modalData, 'relatedPeopleName', this.resolveOperatorNameById(relatedPeopleCode))
  2632. }
  2633. },
  2634. buildRelatedPeopleOptions (selectedOperatorIds) {
  2635. const normalizedIds = (Array.isArray(selectedOperatorIds) ? selectedOperatorIds : (this.modalData.hsfApproverCodeList || []))
  2636. .map(item => this.resolveOperatorIdByCodeOrName(item))
  2637. .filter(item => !!item)
  2638. const selectedSet = new Set(normalizedIds)
  2639. let optionList = (this.hsfApproverOptionList || [])
  2640. .filter(item => selectedSet.has(String(item.operatorId || '').trim()))
  2641. .map(item => ({
  2642. operatorId: item.operatorId,
  2643. operatorName: item.operatorName
  2644. }))
  2645. const existingIdSet = new Set(optionList.map(item => String(item.operatorId || '').trim()))
  2646. normalizedIds.forEach(operatorId => {
  2647. if (existingIdSet.has(operatorId)) {
  2648. return
  2649. }
  2650. optionList.push({
  2651. operatorId: operatorId,
  2652. operatorName: this.resolveOperatorNameById(operatorId)
  2653. })
  2654. existingIdSet.add(operatorId)
  2655. })
  2656. this.relatedPeopleOptionList = optionList
  2657. this.filterRelatedPeopleOptions()
  2658. const selectedRelatedPeopleCode = this.resolveOperatorIdByCodeOrName(this.modalData.relatedPeople)
  2659. const selectedRelatedPeopleRow = optionList.find(item => String(item.operatorId || '').trim() === selectedRelatedPeopleCode)
  2660. if (!selectedRelatedPeopleRow) {
  2661. this.$set(this.modalData, 'relatedPeople', '')
  2662. this.$set(this.modalData, 'relatedPeopleName', '')
  2663. } else {
  2664. this.$set(this.modalData, 'relatedPeople', selectedRelatedPeopleCode)
  2665. this.$set(this.modalData, 'relatedPeopleName', String(selectedRelatedPeopleRow.operatorName || '').trim())
  2666. }
  2667. },
  2668. normalizeHsfApproverOptionList (rows) {
  2669. if (!Array.isArray(rows)) {
  2670. return []
  2671. }
  2672. return rows
  2673. .map(item => {
  2674. const operatorId = String(item.operatorId || item.operator_id || item.username || item.userName || '').trim()
  2675. const operatorName = String(item.operatorName || item.operator_name || item.userDisplay || item.user_display || '').trim()
  2676. if (!operatorId || !operatorName) {
  2677. return null
  2678. }
  2679. return {
  2680. operatorId,
  2681. operatorName
  2682. }
  2683. })
  2684. .filter(item => !!item)
  2685. },
  2686. filterHsfApproverOptions () {
  2687. const operatorIdKeyword = String(this.hsfApproverSearchData.operatorId || '').trim().toUpperCase()
  2688. const operatorNameKeyword = String(this.hsfApproverSearchData.operatorName || '').trim().toUpperCase()
  2689. this.hsfApproverDisplayList = (this.hsfApproverOptionList || []).filter(item => {
  2690. const operatorId = String(item.operatorId || '').toUpperCase()
  2691. const operatorName = String(item.operatorName || '').toUpperCase()
  2692. const matchOperatorId = !operatorIdKeyword || operatorId.includes(operatorIdKeyword)
  2693. const matchOperatorName = !operatorNameKeyword || operatorName.includes(operatorNameKeyword)
  2694. return matchOperatorId && matchOperatorName
  2695. })
  2696. },
  2697. filterRelatedPeopleOptions () {
  2698. const operatorIdKeyword = String(this.relatedPeopleSearchData.operatorId || '').trim().toUpperCase()
  2699. const operatorNameKeyword = String(this.relatedPeopleSearchData.operatorName || '').trim().toUpperCase()
  2700. this.relatedPeopleDisplayList = (this.relatedPeopleOptionList || []).filter(item => {
  2701. const operatorId = String(item.operatorId || '').toUpperCase()
  2702. const operatorName = String(item.operatorName || '').toUpperCase()
  2703. const matchOperatorId = !operatorIdKeyword || operatorId.includes(operatorIdKeyword)
  2704. const matchOperatorName = !operatorNameKeyword || operatorName.includes(operatorNameKeyword)
  2705. return matchOperatorId && matchOperatorName
  2706. })
  2707. },
  2708. openHsfApproverChooseModal () {
  2709. if (this.isRohsFieldDisabled('hsfApprover')) {
  2710. return
  2711. }
  2712. if (!this.modalData || !String(this.modalData.process || '').trim()) {
  2713. this.$message.warning('请先选择工艺')
  2714. return
  2715. }
  2716. this.loadHsfApproverByCurrentProcess(false).then(() => {
  2717. if (!this.hsfApproverOptionList || this.hsfApproverOptionList.length === 0) {
  2718. this.$message.warning('未查询到可选HSF审批人')
  2719. return
  2720. }
  2721. this.hsfApproverFlag = true
  2722. })
  2723. },
  2724. openHsfApproverDialog () {
  2725. this.hsfApproverSearchData = {
  2726. operatorId: '',
  2727. operatorName: ''
  2728. }
  2729. this.filterHsfApproverOptions()
  2730. const selectedOperatorSet = new Set(
  2731. (this.modalData.hsfApproverCodeList || [])
  2732. .map(item => String(item || '').trim())
  2733. .filter(item => !!item)
  2734. )
  2735. const selectedRows = (this.hsfApproverOptionList || []).filter(item => selectedOperatorSet.has(String(item.operatorId || '').trim()))
  2736. this.hsfApproverSelectionCache = JSON.parse(JSON.stringify(selectedRows))
  2737. this.$nextTick(() => {
  2738. if (!this.$refs.hsfApproverTable) {
  2739. return
  2740. }
  2741. this.$refs.hsfApproverTable.clearSelection()
  2742. selectedRows.forEach(item => {
  2743. this.$refs.hsfApproverTable.toggleRowSelection(item, true)
  2744. })
  2745. })
  2746. },
  2747. closeHsfApproverDialog () {
  2748. this.hsfApproverSelectionCache = []
  2749. },
  2750. handleHsfApproverSelectionChange (rows) {
  2751. this.hsfApproverSelectionCache = rows || []
  2752. },
  2753. handleHsfApproverTableClick (row, column, event, tableRef) {
  2754. if (this.$refs[tableRef]) {
  2755. this.$refs[tableRef].toggleRowSelection(row)
  2756. }
  2757. },
  2758. saveHsfApproverChooseModal () {
  2759. const selectedCodes = (this.hsfApproverSelectionCache || [])
  2760. .map(item => String(item.operatorId || '').trim())
  2761. .filter(item => !!item)
  2762. this.$set(this.modalData, 'hsfApproverCodeList', selectedCodes)
  2763. this.syncHsfApproverFields()
  2764. this.hsfApproverFlag = false
  2765. },
  2766. clearHsfApproverSelection () {
  2767. this.$set(this.modalData, 'hsfApproverCodeList', [])
  2768. this.syncHsfApproverFields()
  2769. },
  2770. openRelatedPeopleChooseModal () {
  2771. if (this.isRohsFieldDisabled('relatedPeople')) {
  2772. return
  2773. }
  2774. if (!this.modalData || !Array.isArray(this.modalData.hsfApproverCodeList) || this.modalData.hsfApproverCodeList.length === 0) {
  2775. this.$message.warning('请先选择HSF审批人')
  2776. return
  2777. }
  2778. this.buildRelatedPeopleOptions(this.modalData.hsfApproverCodeList)
  2779. if (!this.relatedPeopleOptionList || this.relatedPeopleOptionList.length === 0) {
  2780. this.$message.warning('未查询到可选Inform Related people')
  2781. return
  2782. }
  2783. this.relatedPeopleFlag = true
  2784. },
  2785. openRelatedPeopleDialog () {
  2786. this.relatedPeopleSearchData = {
  2787. operatorId: '',
  2788. operatorName: ''
  2789. }
  2790. this.filterRelatedPeopleOptions()
  2791. const relatedPeopleCode = String(this.modalData.relatedPeople || '').trim()
  2792. const selectedRow = (this.relatedPeopleOptionList || []).find(item => String(item.operatorId || '').trim() === relatedPeopleCode) || null
  2793. this.relatedPeopleSelection = selectedRow
  2794. this.$nextTick(() => {
  2795. if (!this.$refs.relatedPeopleTable) {
  2796. return
  2797. }
  2798. this.$refs.relatedPeopleTable.setCurrentRow(selectedRow || null)
  2799. })
  2800. },
  2801. closeRelatedPeopleDialog () {
  2802. this.relatedPeopleSelection = null
  2803. },
  2804. handleRelatedPeopleCurrentChange (row) {
  2805. this.relatedPeopleSelection = row || null
  2806. },
  2807. handleRelatedPeopleTableClick (row) {
  2808. this.relatedPeopleSelection = row || null
  2809. if (this.$refs.relatedPeopleTable) {
  2810. this.$refs.relatedPeopleTable.setCurrentRow(row)
  2811. }
  2812. },
  2813. saveRelatedPeopleChooseModal () {
  2814. const selectedCode = this.relatedPeopleSelection ? String(this.relatedPeopleSelection.operatorId || '').trim() : ''
  2815. const selectedName = this.relatedPeopleSelection ? String(this.relatedPeopleSelection.operatorName || '').trim() : ''
  2816. this.$set(this.modalData, 'relatedPeople', selectedCode)
  2817. this.$set(this.modalData, 'relatedPeopleName', selectedName)
  2818. this.relatedPeopleFlag = false
  2819. },
  2820. clearRelatedPeopleSelection () {
  2821. this.$set(this.modalData, 'relatedPeople', '')
  2822. this.$set(this.modalData, 'relatedPeopleName', '')
  2823. this.relatedPeopleSelection = null
  2824. if (this.$refs.relatedPeopleTable) {
  2825. this.$refs.relatedPeopleTable.setCurrentRow(null)
  2826. }
  2827. },
  2828. clearHsfApproverFields (clearBuNo = false) {
  2829. if (clearBuNo) {
  2830. this.$set(this.modalData, 'buNo', '')
  2831. }
  2832. this.hsfApproverOptionList = []
  2833. this.hsfApproverDisplayList = []
  2834. this.hsfApproverSelectionCache = []
  2835. this.relatedPeopleOptionList = []
  2836. this.relatedPeopleDisplayList = []
  2837. this.relatedPeopleSelection = null
  2838. this.relatedPeopleFlag = false
  2839. this.hsfApproverSearchData = {
  2840. operatorId: '',
  2841. operatorName: ''
  2842. }
  2843. this.relatedPeopleSearchData = {
  2844. operatorId: '',
  2845. operatorName: ''
  2846. }
  2847. this.$set(this.modalData, 'hsfApproverCodeList', [])
  2848. this.$set(this.modalData, 'hsfApprover', '')
  2849. this.$set(this.modalData, 'hsfApproverName', '')
  2850. this.$set(this.modalData, 'relatedPeople', '')
  2851. this.$set(this.modalData, 'relatedPeopleName', '')
  2852. },
  2853. loadHsfApproverByCurrentProcess (forceSelectAll = false) {
  2854. if (!this.modalData || !this.modalData.site) {
  2855. this.hsfApproverOptionList = []
  2856. this.hsfApproverDisplayList = []
  2857. this.hsfApproverSelectionCache = []
  2858. if (forceSelectAll) {
  2859. this.clearHsfApproverFields(false)
  2860. }
  2861. return Promise.resolve()
  2862. }
  2863. const buNo = String(this.modalData.process || '').trim()
  2864. if (!buNo) {
  2865. if (forceSelectAll) {
  2866. this.$message.warning('请先选择工艺')
  2867. this.clearHsfApproverFields(false)
  2868. }
  2869. this.hsfApproverOptionList = []
  2870. this.hsfApproverDisplayList = []
  2871. this.hsfApproverSelectionCache = []
  2872. return Promise.resolve()
  2873. }
  2874. const params = {
  2875. site: this.modalData.site,
  2876. buNo: buNo,
  2877. roleNo: 'R015'
  2878. }
  2879. return api.searchBmUser(params).then(({data}) => {
  2880. if (data && data.code === 0 && Array.isArray(data.rows)) {
  2881. this.hsfApproverOptionList = this.normalizeHsfApproverOptionList(data.rows)
  2882. this.filterHsfApproverOptions()
  2883. this.hsfApproverSelectionCache = []
  2884. if (forceSelectAll) {
  2885. const defaultSelectedCodes = this.hsfApproverOptionList.map(item => item.operatorId).filter(item => item)
  2886. this.$set(this.modalData, 'hsfApproverCodeList', defaultSelectedCodes)
  2887. }
  2888. this.syncHsfApproverFields()
  2889. } else {
  2890. this.hsfApproverOptionList = []
  2891. this.hsfApproverDisplayList = []
  2892. this.hsfApproverSelectionCache = []
  2893. if (forceSelectAll) {
  2894. this.clearHsfApproverFields(false)
  2895. }
  2896. }
  2897. }).catch(() => {
  2898. this.hsfApproverOptionList = []
  2899. this.hsfApproverDisplayList = []
  2900. this.hsfApproverSelectionCache = []
  2901. if (forceSelectAll) {
  2902. this.clearHsfApproverFields(false)
  2903. }
  2904. })
  2905. },
  2906. isCurrentApprover () {
  2907. return this.superAdmin || (this.modalData.createBy2 && this.modalData.createBy2.split(';').includes(this.createBy2))
  2908. },
  2909. canSaveAction () {
  2910. return !this.showModalFlag && (this.modalData.status === '草稿' || (this.modalData.status === '审批中' && this.isCurrentApprover()))
  2911. },
  2912. canAgreeAction () {
  2913. return this.authSubmit && this.isCurrentApprover() && this.modalData.status === '审批中' && this.modalData.tpProcessControl !== 'Y' && this.modalData.csProcessControl !== 'Y'
  2914. },
  2915. canRejectAction () {
  2916. return this.authReject && this.isCurrentApprover() && this.modalData.status === '审批中' && this.modalData.isReject === 'Y'
  2917. },
  2918. hasPersistedRohsRecord () {
  2919. return !!(this.modalData && this.modalData.site && this.modalData.referenceNo && !String(this.modalData.referenceNo).startsWith('TEMP-'))
  2920. },
  2921. openRohsRemarkDialog () {
  2922. this.$set(this.rohsRemarkForm, 'remark', this.modalData.remark || '')
  2923. this.rohsRemarkFlag = true
  2924. },
  2925. refreshRohsRemark () {
  2926. if (!this.hasPersistedRohsRecord()) {
  2927. this.$set(this.rohsRemarkForm, 'remark', this.modalData.remark || '')
  2928. return
  2929. }
  2930. api.getRohsDetail(this.modalData.site, this.modalData.referenceNo).then(({data}) => {
  2931. if (data && data.code === 0 && data.data) {
  2932. this.$set(this.rohsRemarkForm, 'remark', data.data.remark || '')
  2933. } else {
  2934. this.$message.error((data && data.msg) || '刷新失败')
  2935. }
  2936. }).catch(() => {
  2937. this.$message.error('刷新失败')
  2938. })
  2939. },
  2940. saveRohsRemark () {
  2941. const remark = this.rohsRemarkForm.remark || ''
  2942. if (!this.hasPersistedRohsRecord()) {
  2943. this.$set(this.modalData, 'remark', remark)
  2944. this.rohsRemarkFlag = false
  2945. this.$message.success('暂存成功,保存单据后写入数据库')
  2946. return
  2947. }
  2948. const params = {
  2949. site: this.modalData.site,
  2950. referenceNo: this.modalData.referenceNo,
  2951. remark: remark
  2952. }
  2953. api.updateRohsRemark(params).then(({data}) => {
  2954. if (data && data.code === 0) {
  2955. this.$set(this.modalData, 'remark', remark)
  2956. if (this.currentRow && this.currentRow.site === this.modalData.site && this.currentRow.referenceNo === this.modalData.referenceNo) {
  2957. this.$set(this.currentRow, 'remark', remark)
  2958. }
  2959. const target = (this.dataList || []).find(item => item.site === this.modalData.site && item.referenceNo === this.modalData.referenceNo)
  2960. if (target) {
  2961. this.$set(target, 'remark', remark)
  2962. }
  2963. this.rohsRemarkFlag = false
  2964. this.$message.success('操作成功')
  2965. } else {
  2966. this.$message.error((data && data.msg) || '保存失败')
  2967. }
  2968. }).catch(() => {
  2969. this.$message.error('保存失败')
  2970. })
  2971. },
  2972. openRohsMaterialDescDialog () {
  2973. this.$set(this.rohsMaterialDescForm, 'materialDesc', this.modalData.materialDesc || '')
  2974. this.rohsMaterialDescFlag = true
  2975. },
  2976. refreshRohsMaterialDesc () {
  2977. if (!this.hasPersistedRohsRecord()) {
  2978. this.$set(this.rohsMaterialDescForm, 'materialDesc', this.modalData.materialDesc || '')
  2979. return
  2980. }
  2981. api.getRohsDetail(this.modalData.site, this.modalData.referenceNo).then(({data}) => {
  2982. if (data && data.code === 0 && data.data) {
  2983. this.$set(this.rohsMaterialDescForm, 'materialDesc', data.data.materialDesc || '')
  2984. } else {
  2985. this.$message.error((data && data.msg) || '刷新失败')
  2986. }
  2987. }).catch(() => {
  2988. this.$message.error('刷新失败')
  2989. })
  2990. },
  2991. saveRohsMaterialDesc () {
  2992. const materialDesc = this.rohsMaterialDescForm.materialDesc || ''
  2993. if (!this.hasPersistedRohsRecord()) {
  2994. this.$set(this.modalData, 'materialDesc', materialDesc)
  2995. this.rohsMaterialDescFlag = false
  2996. this.$message.success('暂存成功,保存单据后写入数据库')
  2997. return
  2998. }
  2999. const params = {
  3000. site: this.modalData.site,
  3001. referenceNo: this.modalData.referenceNo,
  3002. materialDesc: materialDesc
  3003. }
  3004. api.updateRohsMaterialDesc(params).then(({data}) => {
  3005. if (data && data.code === 0) {
  3006. this.$set(this.modalData, 'materialDesc', materialDesc)
  3007. if (this.currentRow && this.currentRow.site === this.modalData.site && this.currentRow.referenceNo === this.modalData.referenceNo) {
  3008. this.$set(this.currentRow, 'materialDesc', materialDesc)
  3009. }
  3010. const target = (this.dataList || []).find(item => item.site === this.modalData.site && item.referenceNo === this.modalData.referenceNo)
  3011. if (target) {
  3012. this.$set(target, 'materialDesc', materialDesc)
  3013. }
  3014. this.rohsMaterialDescFlag = false
  3015. this.$message.success('操作成功')
  3016. } else {
  3017. this.$message.error((data && data.msg) || '保存失败')
  3018. }
  3019. }).catch(() => {
  3020. this.$message.error('保存失败')
  3021. })
  3022. },
  3023. loadModalButtonCondition () {
  3024. if (!this.modalData.site || !this.modalData.referenceNo || this.modalData.status !== '审批中') {
  3025. this.$set(this.modalData, 'createBy2', '')
  3026. this.$set(this.modalData, 'isReject', 'Y')
  3027. this.$set(this.modalData, 'tpProcessControl', 'N')
  3028. this.$set(this.modalData, 'csProcessControl', 'N')
  3029. return
  3030. }
  3031. let params = {
  3032. site: this.modalData.site,
  3033. referenceNo: this.modalData.referenceNo
  3034. }
  3035. api.getRohsButtonCondition(params).then(({data}) => {
  3036. if (data && data.code === 0 && data.data) {
  3037. this.$set(this.modalData, 'createBy2', data.data.createBy2 || '')
  3038. this.$set(this.modalData, 'isReject', data.data.isReject || 'Y')
  3039. this.$set(this.modalData, 'tpProcessControl', data.data.tpProcessControl || 'N')
  3040. this.$set(this.modalData, 'csProcessControl', data.data.csProcessControl || 'N')
  3041. } else {
  3042. this.$set(this.modalData, 'createBy2', '')
  3043. this.$set(this.modalData, 'isReject', 'Y')
  3044. this.$set(this.modalData, 'tpProcessControl', 'N')
  3045. this.$set(this.modalData, 'csProcessControl', 'N')
  3046. }
  3047. }).catch(() => {
  3048. this.$set(this.modalData, 'createBy2', '')
  3049. this.$set(this.modalData, 'isReject', 'Y')
  3050. this.$set(this.modalData, 'tpProcessControl', 'N')
  3051. this.$set(this.modalData, 'csProcessControl', 'N')
  3052. })
  3053. },
  3054. // 列表行选中变色
  3055. rowStyle ({row}) {
  3056. if (this.currentRow && this.currentRow.referenceNo === row.referenceNo) {
  3057. return { 'background-color': '#E8F7F6', cursor: 'pointer' }
  3058. }
  3059. },
  3060. // 获取按钮的权限数据
  3061. getButtonAuthData () {
  3062. this.authSearch = this.isAuth(this.menuId+":search")
  3063. this.authUpdate = this.isAuth(this.menuId+":update")
  3064. this.authIssue = this.isAuth(this.menuId+":issue")
  3065. this.authSubmit = this.isAuth(this.menuId+":submit")
  3066. this.authReject = this.isAuth(this.menuId+":reject")
  3067. this.authFileSave = this.isAuth(this.menuId+":fileSave")
  3068. this.authFileDownLoad = this.isAuth(this.menuId+":fileDownLoad")
  3069. this.authFileRemove = this.isAuth(this.menuId+":fileRemove")
  3070. this.authFilePreview = this.isAuth(this.menuId+":filePreview")
  3071. this.authDataEntry = this.isAuth(this.menuId+":dataEntry")
  3072. this.authMaterialDescRemark = this.isAuth(this.menuId + ":materialDescRemark")
  3073. this.authDelete = this.isAuth(this.menuId+":delete")
  3074. },
  3075. // 校验是否为超级管理员
  3076. checkSuperAdmin () {
  3077. checkSuperAdmin().then(({data}) => {
  3078. this.superAdmin = data.superAdmin
  3079. })
  3080. },
  3081. changeClickRow (row, column, event) {
  3082. this.loadCurrentRowFromServer(row, row || {})
  3083. },
  3084. currentChange (val) {
  3085. if (val) {
  3086. this.loadCurrentRowFromServer(val, val || {})
  3087. } else {
  3088. this.currentRow = {}
  3089. this.approvalList = []
  3090. }
  3091. },
  3092. dataListSelectionChange (rows) {
  3093. this.dataListSelections = rows || []
  3094. },
  3095. applyCurrentRowData (detailData, fallbackData = {}) {
  3096. this.currentRow = detailData || {}
  3097. if (!Array.isArray(this.currentRow.materialList)) {
  3098. this.$set(this.currentRow, 'materialList', [])
  3099. }
  3100. this.fillDisplayFields(this.currentRow, fallbackData || {})
  3101. this.syncDataListRow(this.currentRow)
  3102. this.refreshCurrentTabTable()
  3103. },
  3104. syncDataListRow (rowData) {
  3105. if (!rowData || !rowData.site || !rowData.referenceNo || !Array.isArray(this.dataList)) {
  3106. return
  3107. }
  3108. const targetIndex = this.dataList.findIndex(item => item.site === rowData.site && item.referenceNo === rowData.referenceNo)
  3109. if (targetIndex < 0) {
  3110. return
  3111. }
  3112. const mergedRow = {
  3113. ...this.dataList[targetIndex],
  3114. ...rowData
  3115. }
  3116. this.fillDisplayFields(mergedRow, this.dataList[targetIndex] || {})
  3117. this.$set(this.dataList, targetIndex, mergedRow)
  3118. },
  3119. loadCurrentRowFromServer (row, fallbackData = {}) {
  3120. if (!row || !row.site || !row.referenceNo) {
  3121. this.applyCurrentRowData(row || {}, fallbackData || {})
  3122. return Promise.resolve()
  3123. }
  3124. return api.getRohsDetail(row.site, row.referenceNo).then(({data}) => {
  3125. if (data && data.code === 0 && data.data) {
  3126. this.applyCurrentRowData(data.data, fallbackData || row)
  3127. } else {
  3128. this.applyCurrentRowData(row || {}, fallbackData || {})
  3129. }
  3130. }).catch(() => {
  3131. this.applyCurrentRowData(row || {}, fallbackData || {})
  3132. })
  3133. },
  3134. refreshCurrentRowFromServer (site, referenceNo) {
  3135. const querySite = site || (this.currentRow && this.currentRow.site)
  3136. const queryReferenceNo = referenceNo || (this.currentRow && this.currentRow.referenceNo)
  3137. if (!querySite || !queryReferenceNo || String(queryReferenceNo).startsWith('TEMP-')) {
  3138. return Promise.resolve()
  3139. }
  3140. return this.loadCurrentRowFromServer({
  3141. site: querySite,
  3142. referenceNo: queryReferenceNo
  3143. }, this.currentRow || {})
  3144. },
  3145. refreshOssRef (refName) {
  3146. const ref = this.$refs[refName]
  3147. if (!ref) {
  3148. return
  3149. }
  3150. const refList = Array.isArray(ref) ? ref : [ref]
  3151. refList.forEach(item => {
  3152. if (item && typeof item.handleQuery === 'function') {
  3153. item.handleQuery()
  3154. }
  3155. })
  3156. },
  3157. refreshAttachmentPanels () {
  3158. this.refreshOssRef('modalAttachmentTdsOss')
  3159. this.refreshOssRef('modalAttachmentMsdsOss')
  3160. this.refreshOssRef('modalAttachmentTestReportOss')
  3161. this.refreshOssRef('modalAttachmentOtherOss')
  3162. this.refreshOssRef('modalTdsOss')
  3163. this.refreshOssRef('bottomAttachmentOss')
  3164. this.refreshOssRef('bottomTdsOss')
  3165. },
  3166. handleModalClose () {
  3167. const site = this.modalData.site
  3168. const referenceNo = this.modalData.referenceNo
  3169. this.modalFlag = false
  3170. this.rohsCreatePartDialogFlag = false
  3171. this.rohsCharacteristicDialogFlag = false
  3172. this.rohsMaterialDescFlag = false
  3173. this.rohsCreatePartTab = 'General'
  3174. this.$nextTick(() => {
  3175. this.refreshAttachmentPanels()
  3176. })
  3177. this.refreshCurrentRowFromServer(site, referenceNo)
  3178. },
  3179. fillDisplayFields (target, fallbackData = {}) {
  3180. if (!target) {
  3181. return
  3182. }
  3183. const fields = ['nodeId', 'nodeName', 'currentApprover', 'applicantName', 'pmName', 'npdEngineerName', 'technicalPlanName', 'buyerName', 'endCustomerName', 'projectName', 'commGroup1Desc', 'commGroup2Desc', 'commGroup3Desc', 'hsfApproverName', 'relatedPeopleName']
  3184. fields.forEach(field => {
  3185. const value = target[field] || fallbackData[field] || ''
  3186. this.$set(target, field, value)
  3187. })
  3188. this.$set(target, 'endCustomerFlag', !!target.endCustomerFlag)
  3189. this.$set(target, 'projectIdFlag', !!target.projectIdFlag)
  3190. const validUntilValue = target.validUntilValue !== undefined && target.validUntilValue !== null && target.validUntilValue !== ''
  3191. ? target.validUntilValue
  3192. : fallbackData.validUntilValue
  3193. this.$set(target, 'validUntilValue', this.normalizeValidUntilValue(validUntilValue))
  3194. const applicationDate = target.applicationDate || fallbackData.applicationDate || ''
  3195. const plannedMassProductionDate = target.plannedMassProductionDate || fallbackData.plannedMassProductionDate || ''
  3196. const expiredDate = target.expiredDate || fallbackData.expiredDate || ''
  3197. const normalizedExpiredDate = this.normalizeDateOnly(expiredDate)
  3198. this.$set(target, 'applicationDate', this.normalizeDateOnly(applicationDate))
  3199. this.$set(target, 'plannedMassProductionDate', this.normalizeDateOnly(plannedMassProductionDate))
  3200. this.$set(target, 'expiredDate', normalizedExpiredDate)
  3201. this.$set(target, 'expiryDate', this.calculateExpiryDateByRule(normalizedExpiredDate, target.validUntilValue, target.validUntil))
  3202. },
  3203. refreshCurrentTabTable () {
  3204. if (this.activeTable === 'approvalInformation') {
  3205. this.getApprovalList()
  3206. return
  3207. }
  3208. if (this.activeTable === 'attachment') {
  3209. this.refreshOssRef('bottomAttachmentOss')
  3210. return
  3211. }
  3212. if (this.activeTable === 'npdInfo') {
  3213. this.refreshOssRef('bottomTdsOss')
  3214. }
  3215. },
  3216. getApprovalList () {
  3217. if (!this.currentRow || !this.currentRow.site || !this.currentRow.referenceNo) {
  3218. this.approvalList = []
  3219. return
  3220. }
  3221. let params = {
  3222. site: this.currentRow.site,
  3223. menuId: this.menuId,
  3224. documentNo: this.currentRow.referenceNo
  3225. }
  3226. api.getRohsApprovalList(params).then(({data}) => {
  3227. if (data && data.code === 0) {
  3228. this.approvalList = data.rows || []
  3229. } else {
  3230. this.approvalList = []
  3231. }
  3232. }).catch(() => {
  3233. this.approvalList = []
  3234. })
  3235. },
  3236. // 获取列表
  3237. getDataList () {
  3238. if (!this.authSearch) {
  3239. this.dataList = []
  3240. this.dataListSelections = []
  3241. this.totalPage = 0
  3242. this.currentRow = {}
  3243. this.approvalList = []
  3244. this.isFilterSearch = false
  3245. return
  3246. }
  3247. this.dataListLoading = true
  3248. let params = {
  3249. page: this.pageIndex,
  3250. limit: this.pageSize,
  3251. site: this.$store.state.user.site,
  3252. menuId: this.menuId,
  3253. referenceNo: this.searchData.referenceNo,
  3254. status: this.searchData.status,
  3255. rohsStatus: this.searchData.rohsStatus,
  3256. currentApprover: this.searchData.currentApprover,
  3257. nodeId: this.searchData.nodeId
  3258. }
  3259. api.getRohsList(params).then(({data}) => {
  3260. if (data && data.code === 0) {
  3261. const list = data.page.list || []
  3262. this.dataList = list.map(item => {
  3263. return {
  3264. applicantName: '',
  3265. pmName: '',
  3266. npdEngineerName: '',
  3267. technicalPlanName: '',
  3268. buyerName: '',
  3269. endCustomerName: '',
  3270. projectName: '',
  3271. nodeId: '',
  3272. nodeName: '',
  3273. currentApprover: '',
  3274. commGroup1Desc: '',
  3275. commGroup2Desc: '',
  3276. commGroup3Desc: '',
  3277. hsfApproverName: '',
  3278. relatedPeopleName: '',
  3279. ...item
  3280. }
  3281. })
  3282. this.dataListSelections = []
  3283. this.totalPage = data.page.totalCount
  3284. this.$nextTick(() => {
  3285. if (this.$refs.rohsTable) {
  3286. this.$refs.rohsTable.clearSelection()
  3287. }
  3288. if (this.$refs.rohsTable && this.dataList.length > 0) {
  3289. this.$refs.rohsTable.setCurrentRow(this.dataList[0])
  3290. } else if (this.$refs.rohsTable) {
  3291. this.$refs.rohsTable.setCurrentRow()
  3292. }
  3293. })
  3294. } else {
  3295. this.dataList = []
  3296. this.dataListSelections = []
  3297. this.totalPage = 0
  3298. this.currentRow = {}
  3299. this.approvalList = []
  3300. }
  3301. this.dataListLoading = false
  3302. }).catch(() => {
  3303. this.dataListSelections = []
  3304. this.currentRow = {}
  3305. this.approvalList = []
  3306. this.dataListLoading = false
  3307. })
  3308. this.isFilterSearch = false
  3309. },
  3310. // 分页
  3311. sizeChangeHandle (val) {
  3312. this.pageSize = val
  3313. this.pageIndex = 1
  3314. if (this.isFilterSearch === false) {
  3315. this.getDataList()
  3316. } else {
  3317. this.queryByAnyField(this.filterSearchData)
  3318. }
  3319. },
  3320. currentChangeHandle (val) {
  3321. this.pageIndex = val
  3322. if (this.isFilterSearch === false) {
  3323. this.getDataList()
  3324. } else {
  3325. this.queryByAnyField(this.filterSearchData)
  3326. }
  3327. },
  3328. // 搜索条件点击
  3329. searchHandle () {
  3330. if (!this.authSearch) {
  3331. return
  3332. }
  3333. this.filterVisible = true
  3334. },
  3335. queryByAnyField (params) {
  3336. const queryParams = {
  3337. ...(params || {})
  3338. }
  3339. queryParams.no = this.pageIndex
  3340. queryParams.size = this.pageSize
  3341. queryParams.userId = this.$store.state.user.id.toString()
  3342. queryParams.site = this.$store.state.user.site
  3343. queryParams.menuId = this.menuId
  3344. this.dataListLoading = true
  3345. api.getRohsListAny(queryParams).then(({data}) => {
  3346. if (data && data.code === 0) {
  3347. const list = (data.page && data.page.list) || []
  3348. this.dataList = list.map(item => {
  3349. return {
  3350. applicantName: '',
  3351. pmName: '',
  3352. npdEngineerName: '',
  3353. technicalPlanName: '',
  3354. buyerName: '',
  3355. endCustomerName: '',
  3356. projectName: '',
  3357. nodeId: '',
  3358. nodeName: '',
  3359. currentApprover: '',
  3360. commGroup1Desc: '',
  3361. commGroup2Desc: '',
  3362. commGroup3Desc: '',
  3363. hsfApproverName: '',
  3364. relatedPeopleName: '',
  3365. ...item
  3366. }
  3367. })
  3368. this.dataListSelections = []
  3369. this.totalPage = data.page.totalCount
  3370. this.$nextTick(() => {
  3371. if (this.$refs.rohsTable) {
  3372. this.$refs.rohsTable.clearSelection()
  3373. }
  3374. if (this.$refs.rohsTable && this.dataList.length > 0) {
  3375. this.$refs.rohsTable.setCurrentRow(this.dataList[0])
  3376. } else if (this.$refs.rohsTable) {
  3377. this.$refs.rohsTable.setCurrentRow()
  3378. }
  3379. })
  3380. } else {
  3381. this.$message.warning((data && data.msg) || '搜索失败')
  3382. this.dataList = []
  3383. this.dataListSelections = []
  3384. this.totalPage = 0
  3385. this.currentRow = {}
  3386. this.approvalList = []
  3387. }
  3388. this.dataListLoading = false
  3389. }).catch(() => {
  3390. this.dataList = []
  3391. this.dataListSelections = []
  3392. this.currentRow = {}
  3393. this.approvalList = []
  3394. this.dataListLoading = false
  3395. })
  3396. this.filterSearchData = JSON.parse(JSON.stringify(queryParams))
  3397. this.isFilterSearch = true
  3398. this.filterVisible = false
  3399. },
  3400. buildExportName () {
  3401. const now = new Date()
  3402. const year = String(now.getFullYear())
  3403. const month = String(now.getMonth() + 1).padStart(2, '0')
  3404. const day = String(now.getDate()).padStart(2, '0')
  3405. const hour = String(now.getHours()).padStart(2, '0')
  3406. const minute = String(now.getMinutes()).padStart(2, '0')
  3407. const second = String(now.getSeconds()).padStart(2, '0')
  3408. return 'RoHs记录' + year + month + day + hour + minute + second
  3409. },
  3410. async createExportData () {
  3411. const params = {
  3412. ...this.searchData,
  3413. site: this.$store.state.user.site,
  3414. menuId: this.menuId,
  3415. page: 1,
  3416. limit: -1
  3417. }
  3418. this.resultList = []
  3419. await api.getRohsList(params).then(({data}) => {
  3420. if (data && data.code === 0 && data.page && Array.isArray(data.page.list)) {
  3421. this.resultList = (data.page.list || []).map(item => {
  3422. const row = {
  3423. ...item
  3424. }
  3425. row.applicationDate = this.normalizeDateOnly(row.applicationDate)
  3426. row.plannedMassProductionDate = this.normalizeDateOnly(row.plannedMassProductionDate)
  3427. row.expectReportTime = this.normalizeDateOnly(row.expectReportTime)
  3428. row.expiredDate = this.normalizeDateOnly(row.expiredDate)
  3429. row.expiryDate = this.normalizeDateOnly(row.expiryDate)
  3430. row.validUntilDisplay = this.getValidUntilDisplay(row.validUntilValue, row.validUntil)
  3431. row.hsfApproverName = row.hsfApproverName || row.hsfApprover || ''
  3432. row.relatedPeopleName = row.relatedPeopleName || row.relatedPeople || ''
  3433. return row
  3434. })
  3435. } else {
  3436. this.$message.warning((data && data.msg) || '导出数据获取失败')
  3437. }
  3438. }).catch(() => {
  3439. this.$message.error('导出数据获取失败')
  3440. })
  3441. return this.resultList
  3442. },
  3443. startDownload () {
  3444. this.exportName = this.buildExportName()
  3445. this.exportFieldMap = this.buildExportFields()
  3446. if (!this.exportFieldMap || Object.keys(this.exportFieldMap).length === 0) {
  3447. this.$message.warning('未获取到可导出的列,请稍后重试')
  3448. }
  3449. this.exportLoading = true
  3450. },
  3451. finishDownload () {
  3452. this.exportLoading = false
  3453. },
  3454. buildExportFields () {
  3455. const tableRef = this.$refs.rohsTable
  3456. if (!tableRef || !Array.isArray(tableRef.columns)) {
  3457. return {}
  3458. }
  3459. const fields = {}
  3460. tableRef.columns.forEach(column => {
  3461. const label = column && column.label ? String(column.label).trim() : ''
  3462. const property = column && column.property ? String(column.property).trim() : ''
  3463. if (!label || !property || label === '操作') {
  3464. return
  3465. }
  3466. fields[label] = property
  3467. })
  3468. return fields
  3469. },
  3470. // 单选可取消
  3471. radioClick (field, value) {
  3472. if (this.modalData[field] === value) {
  3473. this.modalData[field] = ''
  3474. } else {
  3475. this.modalData[field] = value
  3476. }
  3477. },
  3478. // 新增 / 修改
  3479. addOrUpdateHandle (row) {
  3480. if (!row && !this.authUpdate) {
  3481. this.$message.warning('没有新增权限')
  3482. return
  3483. }
  3484. if (row && !this.authUpdate && !this.authDataEntry) {
  3485. this.$message.warning('没有编辑权限')
  3486. return
  3487. }
  3488. this.modalFlag = true
  3489. this.activeName = 'basicInfo'
  3490. this.submitModalFlag = false
  3491. this.rohsRemarkFlag = false
  3492. this.rohsMaterialDescFlag = false
  3493. this.rejectOpinion = ''
  3494. this.rohsRemarkForm = {
  3495. remark: ''
  3496. }
  3497. this.rohsMaterialDescForm = {
  3498. materialDesc: ''
  3499. }
  3500. this.projectMaterialDialogFlag = false
  3501. this.rohsCreatePartDialogFlag = false
  3502. this.rohsCreatePartLoading = false
  3503. this.rohsCreatePartTab = 'General'
  3504. this.rohsCreatePartTagNo = 0
  3505. this.rohsCharacteristicDialogFlag = false
  3506. this.rohsCharacteristicQueryData = {
  3507. propertiesItemNo: '',
  3508. itemDesc: ''
  3509. }
  3510. this.rohsCharacteristicList = []
  3511. this.rohsCharacteristicSelections = []
  3512. this.rohsPartItemSelections = []
  3513. this.projectMaterialSelections = []
  3514. this.materialSelections = []
  3515. this.hsfApproverOptionList = []
  3516. this.hsfApproverDisplayList = []
  3517. this.hsfApproverSelectionCache = []
  3518. this.hsfApproverSearchData = {
  3519. operatorId: '',
  3520. operatorName: ''
  3521. }
  3522. this.hsfApproverFlag = false
  3523. this.relatedPeopleOptionList = []
  3524. this.relatedPeopleDisplayList = []
  3525. this.relatedPeopleSelection = null
  3526. this.relatedPeopleSearchData = {
  3527. operatorId: '',
  3528. operatorName: ''
  3529. }
  3530. this.relatedPeopleFlag = false
  3531. this.plmRohsAuthorityArr = []
  3532. this.nodeAuthorityLoaded = !row
  3533. this.isEditMode = !!row
  3534. this.projectMaterialPageIndex = 1
  3535. this.projectMaterialTotal = 0
  3536. this.projectMaterialList = []
  3537. this.projectMaterialSearchData = {
  3538. finalPartNo: '',
  3539. partDesc: '',
  3540. partStatus: ''
  3541. }
  3542. this.showModalFlag = !!(row && (row.status === '已完成' || !this.authUpdate))
  3543. if (row) {
  3544. this.modalTitle = 'RoHS 编辑'
  3545. api.getRohsDetail(row.site, row.referenceNo).then(({data}) => {
  3546. if (data && data.code === 0) {
  3547. this.modalData = data.data || {}
  3548. this.$set(this.modalData, 'qualificationDocumentsNeededList', this.modalData.qualificationDocumentsNeeded ? this.modalData.qualificationDocumentsNeeded.split(';').filter(item => item) : [])
  3549. this.$set(this.modalData, 'testReportIncludingItemsList', this.modalData.testReportIncludingItems ? this.modalData.testReportIncludingItems.split(';').filter(item => item) : [])
  3550. this.$set(this.modalData, 'materialClassifyList', this.modalData.materialClassify ? this.modalData.materialClassify.split(';').filter(item => item) : [])
  3551. this.$set(this.modalData, 'materialList', Array.isArray(this.modalData.materialList) ? this.modalData.materialList : [])
  3552. this.$set(this.modalData, 'hsfApproverCodeList', this.modalData.hsfApprover ? this.modalData.hsfApprover.split(';').filter(item => item) : [])
  3553. this.$set(this.modalData, 'buNo', this.modalData.process || '')
  3554. this.$set(this.modalData, 'isAhGrade', this.normalizeCheckboxFlag(this.modalData.isAhGrade))
  3555. this.$set(this.modalData, 'validUntilValue', this.normalizeValidUntilValue(this.modalData.validUntilValue))
  3556. this.syncHsfApproverFields()
  3557. this.fillDisplayFields(this.modalData, row || {})
  3558. this.applyHsfStandardDefaultByCustomer(this.modalData)
  3559. // 编辑时不允许修改最终客户和项目编码
  3560. this.$set(this.modalData, 'endCustomerFlag', true)
  3561. this.$set(this.modalData, 'projectIdFlag', true)
  3562. this.$set(this.modalData, 'createBy2', '')
  3563. this.$set(this.modalData, 'isReject', 'Y')
  3564. this.$set(this.modalData, 'tpProcessControl', 'N')
  3565. this.$set(this.modalData, 'csProcessControl', 'N')
  3566. this.loadModalButtonCondition()
  3567. this.loadHsfApproverByCurrentProcess(false)
  3568. this.loadNodeAuthority(this.modalData.site || row.site, this.modalData.stepId !== null && this.modalData.stepId !== undefined ? this.modalData.stepId : (row.stepId !== null && row.stepId !== undefined ? row.stepId : 10))
  3569. }
  3570. }).catch(() => {
  3571. this.loadNodeAuthority(row.site, row.stepId !== null && row.stepId !== undefined ? row.stepId : 10)
  3572. })
  3573. } else {
  3574. this.modalTitle = 'RoHS 新增'
  3575. this.showModalFlag = false
  3576. // 生成一个临时ID用于附件上传绑定
  3577. const tempReferenceNo = 'TEMP-' + new Date().getTime() + '-' + Math.floor(Math.random() * 1000)
  3578. this.modalData = {
  3579. site: this.$store.state.user.site,
  3580. referenceNo: tempReferenceNo,
  3581. applicant: this.$store.state.user.name || '',
  3582. applicantName: this.$store.state.user.userDisplay || this.$store.state.user.user_display || '',
  3583. pm: '',
  3584. pmName: '',
  3585. applicationDate: this.getCurrentDateString(),
  3586. process: '',
  3587. plannedMassProductionDate: '',
  3588. color: '',
  3589. vendorCode: '',
  3590. vendorMaterialCode: '',
  3591. materialClassify: '',
  3592. materialClassifyList: [],
  3593. otherMaterialClassify: '',
  3594. materialUseFor: '',
  3595. endCustomer: '',
  3596. endCustomerName: '',
  3597. endCustomerFlag: false,
  3598. projectId: '',
  3599. projectName: '',
  3600. projectIdFlag: true,
  3601. commGroup1: '',
  3602. commGroup1Desc: '',
  3603. commGroup2: '',
  3604. commGroup2Desc: '',
  3605. commGroup3: '',
  3606. commGroup3Desc: '',
  3607. needCreateNumber: '',
  3608. npdEngineer: '',
  3609. npdEngineerName: '',
  3610. materialValidityTime: '',
  3611. materialValidityComments: '',
  3612. needDeviation: '',
  3613. technicalPlan: '',
  3614. wmRequiredSpec: '',
  3615. isFiberMaterial: '',
  3616. materialThickness: '',
  3617. buyer: '',
  3618. buyerName: '',
  3619. expectReportTime: '',
  3620. qualificationDocumentsNeeded: '',
  3621. qualificationDocumentsNeededList: [],
  3622. testReportIncludingItems: '',
  3623. testReportIncludingItemsList: [],
  3624. remark: '',
  3625. status: '草稿',
  3626. sgsReportNumber: '',
  3627. rohsStatus: 'Active',
  3628. expiredDate: '',
  3629. expiryDate: '',
  3630. fiberInformation: '',
  3631. hsfStandard: '',
  3632. hsfApprover: '',
  3633. hsfApproverName: '',
  3634. hsfApproverCodeList: [],
  3635. relatedPeople: '',
  3636. relatedPeopleName: '',
  3637. buNo: '',
  3638. validUntilValue: 0,
  3639. validUntil: '',
  3640. isMeetRohsRequirement: '',
  3641. isAhGrade: 'N',
  3642. hsfSupplierClassification: '',
  3643. materialDesc: '',
  3644. npdRemark: '',
  3645. isSameMaterialDiffSize: '',
  3646. ifsPartNo: '',
  3647. materialList: [],
  3648. stepId: 10,
  3649. rejectFlag: 'N',
  3650. rejectStepId: null,
  3651. createBy2: '',
  3652. isReject: 'Y',
  3653. tpProcessControl: 'N',
  3654. csProcessControl: 'N'
  3655. }
  3656. this.nodeAuthorityLoaded = true
  3657. }
  3658. },
  3659. // 表单提交
  3660. dataFormSubmit () {
  3661. if (!this.canSaveAction()) {
  3662. this.$message.warning('当前状态不允许保存')
  3663. return
  3664. }
  3665. this.$set(this.modalData, 'isAhGrade', this.normalizeCheckboxFlag(this.modalData.isAhGrade))
  3666. this.normalizeHsfStandardByCustomer(this.modalData)
  3667. this.syncHsfApproverFields()
  3668. if (!this.validateValidUntilPair()) {
  3669. return
  3670. }
  3671. this.syncExpiryDateByRule()
  3672. this.modalData.qualificationDocumentsNeeded = this.modalData.qualificationDocumentsNeededList.join(';')
  3673. this.modalData.testReportIncludingItems = this.modalData.testReportIncludingItemsList.join(';')
  3674. this.modalData.materialClassify = this.modalData.materialClassifyList.join(';')
  3675. this.modalData.materialList = (this.modalData.materialList || []).map((item, index) => {
  3676. return {
  3677. ...item,
  3678. lineNo: index + 1,
  3679. projectId: this.modalData.projectId
  3680. }
  3681. })
  3682. const submitMethod = this.modalTitle === 'RoHS 新增' ? api.saveRohs : api.updateRohs
  3683. submitMethod(this.modalData).then(({data}) => {
  3684. if (data && data.code === 0) {
  3685. this.$message.success('操作成功')
  3686. this.modalFlag = false
  3687. this.getDataList()
  3688. } else {
  3689. this.$message.error(data.msg || '操作失败')
  3690. }
  3691. })
  3692. },
  3693. // 同意
  3694. agreeSubmit () {
  3695. if (!this.canAgreeAction()) {
  3696. this.$message.warning('当前状态不允许同意')
  3697. return
  3698. }
  3699. this.$confirm('确认同意该申请单?', '提示', {
  3700. confirmButtonText: '确定',
  3701. cancelButtonText: '取消',
  3702. type: 'warning'
  3703. }).then(() => {
  3704. this.submitRohs('Y')
  3705. })
  3706. },
  3707. openRejectModal () {
  3708. if (!this.canRejectAction()) {
  3709. this.$message.warning('当前状态不允许驳回')
  3710. return
  3711. }
  3712. this.rejectOpinion = ''
  3713. this.submitModalFlag = true
  3714. },
  3715. // 驳回
  3716. rejectSubmit () {
  3717. if (!this.rejectOpinion || !this.rejectOpinion.trim()) {
  3718. this.$message.warning('请填写驳回意见')
  3719. return
  3720. }
  3721. this.submitRohs('N')
  3722. },
  3723. submitRohs (nodeConclusion) {
  3724. if (nodeConclusion === 'Y' && !this.canAgreeAction()) {
  3725. this.$message.warning('当前状态不允许同意')
  3726. return
  3727. }
  3728. if (nodeConclusion === 'N' && !this.canRejectAction()) {
  3729. this.$message.warning('当前状态不允许驳回')
  3730. return
  3731. }
  3732. if (!this.modalData.site || !this.modalData.referenceNo) {
  3733. this.$message.warning('单据主键信息缺失,无法提交审批')
  3734. return
  3735. }
  3736. this.$set(this.modalData, 'isAhGrade', this.normalizeCheckboxFlag(this.modalData.isAhGrade))
  3737. this.normalizeHsfStandardByCustomer(this.modalData)
  3738. this.syncHsfApproverFields()
  3739. if (!this.validateValidUntilPair()) {
  3740. return
  3741. }
  3742. this.syncExpiryDateByRule()
  3743. if (!this.nodeAuthorityLoaded) {
  3744. this.$message.warning('节点权限加载中,请稍后重试')
  3745. return
  3746. }
  3747. if (!this.validateSubmitRequiredFields()) {
  3748. return
  3749. }
  3750. const submitMaterialList = this.normalizeMaterialListForSave(this.modalData.materialList || [])
  3751. this.submitLoading = true
  3752. let params = {
  3753. ...this.modalData,
  3754. site: this.modalData.site,
  3755. referenceNo: this.modalData.referenceNo,
  3756. materialClassify: (this.modalData.materialClassifyList || []).join(';'),
  3757. qualificationDocumentsNeeded: (this.modalData.qualificationDocumentsNeededList || []).join(';'),
  3758. testReportIncludingItems: (this.modalData.testReportIncludingItemsList || []).join(';'),
  3759. materialList: submitMaterialList,
  3760. nodeConclusion: nodeConclusion,
  3761. rejectOpinion: nodeConclusion === 'N' ? this.rejectOpinion : '',
  3762. menuId: this.menuId,
  3763. documentNo: this.modalData.referenceNo
  3764. }
  3765. api.submitRohs(params).then(({data}) => {
  3766. if (data && data.code === 0) {
  3767. this.$message.success(nodeConclusion === 'Y' ? '同意成功' : '驳回成功')
  3768. this.submitModalFlag = false
  3769. this.modalFlag = false
  3770. this.getDataList()
  3771. } else {
  3772. this.$message.error(data.msg || '提交失败')
  3773. }
  3774. this.submitLoading = false
  3775. }).catch(() => {
  3776. this.submitLoading = false
  3777. })
  3778. },
  3779. // 下达
  3780. issueModal (row) {
  3781. if (!this.authIssue) {
  3782. this.$message.warning('没有下达权限')
  3783. return
  3784. }
  3785. this.$confirm('确认下达该申请单?', '提示', {
  3786. confirmButtonText: '确定',
  3787. cancelButtonText: '取消',
  3788. type: 'warning'
  3789. }).then(() => {
  3790. let params = {
  3791. site: row.site,
  3792. referenceNo: row.referenceNo,
  3793. menuId: this.menuId
  3794. }
  3795. api.issueRohs(params).then(({data}) => {
  3796. if (data && data.code === 0) {
  3797. this.$message.success('下达成功')
  3798. if (this.modalFlag && this.modalData.referenceNo === row.referenceNo) {
  3799. this.modalData.status = '审批中'
  3800. }
  3801. this.getDataList()
  3802. } else {
  3803. this.$message.error(data.msg || '下达失败')
  3804. }
  3805. })
  3806. })
  3807. },
  3808. deleteHandle () {
  3809. if (!this.authDelete) {
  3810. this.$message.warning('没有删除权限')
  3811. return
  3812. }
  3813. const selectedRows = (this.dataListSelections || []).filter(item => item && item.site && item.referenceNo)
  3814. if (!selectedRows.length) {
  3815. this.$message.warning('请先勾选要删除的单据')
  3816. return
  3817. }
  3818. const nonDraftRows = selectedRows.filter(item => item.status !== '草稿')
  3819. if (nonDraftRows.length) {
  3820. const previewText = nonDraftRows.slice(0, 3).map(item => item.referenceNo).join('、')
  3821. const suffix = nonDraftRows.length > 3 ? (' 等' + nonDraftRows.length + '条') : ''
  3822. this.$message.warning('仅草稿状态的单据允许删除,当前勾选包含非草稿单据:' + previewText + suffix)
  3823. return
  3824. }
  3825. this.$confirm('确认删除选中的' + selectedRows.length + '条RoHS单据?删除后会同步删除材料和附件数据。', '提示', {
  3826. confirmButtonText: '确定',
  3827. cancelButtonText: '取消',
  3828. type: 'warning'
  3829. }).then(() => {
  3830. const deleteTasks = selectedRows.map(item => {
  3831. return api.deleteRohs({
  3832. site: item.site,
  3833. referenceNo: item.referenceNo
  3834. }).then(({data}) => {
  3835. if (data && data.code === 0) {
  3836. return {
  3837. success: true,
  3838. referenceNo: item.referenceNo
  3839. }
  3840. }
  3841. return {
  3842. success: false,
  3843. referenceNo: item.referenceNo,
  3844. msg: (data && data.msg) || '删除失败'
  3845. }
  3846. }).catch(() => {
  3847. return {
  3848. success: false,
  3849. referenceNo: item.referenceNo,
  3850. msg: '删除失败'
  3851. }
  3852. })
  3853. })
  3854. Promise.all(deleteTasks).then(results => {
  3855. const successRows = results.filter(item => item.success)
  3856. const failRows = results.filter(item => !item.success)
  3857. if (this.modalFlag && successRows.some(item => item.referenceNo === this.modalData.referenceNo)) {
  3858. this.modalFlag = false
  3859. }
  3860. if (!failRows.length) {
  3861. this.$message.success('删除成功,共' + successRows.length + '条')
  3862. } else if (!successRows.length) {
  3863. this.$message.error(failRows[0].msg || '删除失败')
  3864. } else {
  3865. this.$message.warning('已删除' + successRows.length + '条,失败' + failRows.length + '条')
  3866. }
  3867. this.getDataList()
  3868. })
  3869. }).catch(() => {})
  3870. },
  3871. buildRohsCreatePartData () {
  3872. const user = this.$store.state.user || {}
  3873. return {
  3874. site: this.modalData.site || user.site || '',
  3875. partNo: '',
  3876. partDesc: this.modalData.materialDesc || '',
  3877. partType: 'Purchased',
  3878. hazardCode: '',
  3879. hazardDesc: '',
  3880. familyId: '',
  3881. familyName: '',
  3882. groupId: '',
  3883. groupName: '',
  3884. umId: '',
  3885. umName: '',
  3886. weightNet: '',
  3887. uomForWeightNet: 'kg',
  3888. volumeNet: '',
  3889. uomForVolumeNet: 'm3',
  3890. lotTrackingCode: 'Order Based',
  3891. remark: '',
  3892. productGroupId1: this.modalData.commGroup1 || '',
  3893. productGroupName1: this.modalData.commGroup1Desc || '',
  3894. productGroupId2: this.modalData.commGroup2 || '',
  3895. productGroupName2: this.modalData.commGroup2Desc || '',
  3896. productGroupId3: '',
  3897. productGroupName3: '',
  3898. productGroupId4: '*',
  3899. productGroupName4: 'NorthSky Application owner',
  3900. commGroup3: this.modalData.commGroup3 || '',
  3901. commGroup3Desc: this.modalData.commGroup3Desc || '',
  3902. codeNo: '',
  3903. codeDesc: '',
  3904. typeDesignation: '',
  3905. assetClass: 'S',
  3906. assetClassDesc: '标准',
  3907. dimQuality: '',
  3908. abcClass: 'C',
  3909. abcClassDesc: '',
  3910. frequencyClass: 'Very Slow Mover',
  3911. lifecycleStage: 'Development',
  3912. countryOfOrigin: '',
  3913. countryOfOriginDesc: '',
  3914. regionOfOrigin: '',
  3915. regionOfOriginDesc: '',
  3916. manufacturingLeadTime: 0,
  3917. expectedLeadTime: 0,
  3918. durabilityWeek: '',
  3919. durabilityDay: '',
  3920. intrastatConvFactor: undefined,
  3921. customsStatNo: '',
  3922. customsStatDesc: '',
  3923. umDesc: '',
  3924. planningMethod: 'A',
  3925. planningMethodDesc: '',
  3926. partStatus: 'A',
  3927. partStatusDesc: '活动',
  3928. active: 'Y',
  3929. status: 'Y',
  3930. supplyCode: 'Inventory Order',
  3931. configurationId: '*',
  3932. partCostGroupId: '',
  3933. partCostGroupDesc: '',
  3934. inventoryValuationMethod: 'Standard Cost',
  3935. inventoryPartCostLevel: 'Cost Per Part',
  3936. invoiceConsideration: 'Ignore Invoice Price',
  3937. zeroCostFlag: 'Zero Cost Forbidden',
  3938. estimatedMaterialCost: 0,
  3939. safetyStock: 0,
  3940. minOrderQty: 0,
  3941. maxOrderQty: 0,
  3942. mulOrderQty: 0,
  3943. safetyLeadTime: 0,
  3944. shrinkageFac: 0,
  3945. stdOrderQty: 0,
  3946. cumLeadTime: 0,
  3947. byProdAsSupplyInMrpDb: '',
  3948. unprotectedLeadTime: 0,
  3949. backFlushPart: 'All Locations',
  3950. issueType: 'Reserve And Backflush',
  3951. mrpControlFlagDb: 'Y',
  3952. fixedLeadTimeDay: 0,
  3953. overReporting: 'Allowed',
  3954. useTheoreticalDensityDb: '',
  3955. variableLeadTimeDay: 0,
  3956. overReportTolerance: 0,
  3957. fixedLeadTimeHour: 0,
  3958. density: undefined,
  3959. variableLeadTimeHour: 0,
  3960. showInQueryFlag: 'Y',
  3961. temporaryPartFlag: 'N',
  3962. partItemList: [],
  3963. createBy: user.name || '',
  3964. updateBy: user.name || ''
  3965. }
  3966. },
  3967. openCreateIfsPartDialog () {
  3968. if (!this.isEditMode || !this.canEditRohsMaterial()) {
  3969. this.$message.warning('当前状态不允许创建IFS料号')
  3970. return
  3971. }
  3972. this.rohsCreatePartData = this.buildRohsCreatePartData()
  3973. this.rohsCreatePartTab = 'General'
  3974. this.rohsCreatePartTagNo = 0
  3975. this.rohsCharacteristicDialogFlag = false
  3976. this.rohsCharacteristicQueryData = {
  3977. propertiesItemNo: '',
  3978. itemDesc: ''
  3979. }
  3980. this.rohsCharacteristicList = []
  3981. this.rohsCharacteristicSelections = []
  3982. this.rohsPartItemSelections = []
  3983. this.rohsCreatePartDialogFlag = true
  3984. },
  3985. closeRohsCreatePartDialog () {
  3986. this.rohsCreatePartTab = 'General'
  3987. this.rohsCreatePartTagNo = 0
  3988. this.rohsCreatePartLoading = false
  3989. this.rohsCharacteristicDialogFlag = false
  3990. this.rohsCharacteristicQueryData = {
  3991. propertiesItemNo: '',
  3992. itemDesc: ''
  3993. }
  3994. this.rohsCharacteristicList = []
  3995. this.rohsCharacteristicSelections = []
  3996. this.rohsPartItemSelections = []
  3997. this.rohsCreatePartData = this.buildRohsCreatePartData()
  3998. },
  3999. rohsChangeExpectedLeadTime () {
  4000. this.rohsCreatePartData.expectedLeadTime = this.rohsCreatePartData.manufacturingLeadTime
  4001. },
  4002. rohsChangeDurabilityWeek () {
  4003. const day = Number(this.rohsCreatePartData.durabilityDay || 0)
  4004. this.rohsCreatePartData.durabilityWeek = day / 7
  4005. },
  4006. nextRohsCreatePartNo (silent = false) {
  4007. this.rohsCreatePartData.ifsPartNo = this.rohsCreatePartData.partNo
  4008. const params = {
  4009. ...this.rohsCreatePartData,
  4010. ifsPartNo: this.rohsCreatePartData.ifsPartNo,
  4011. site: this.rohsCreatePartData.site || this.$store.state.user.site,
  4012. createBy: this.$store.state.user.name || '',
  4013. updateBy: this.$store.state.user.name || ''
  4014. }
  4015. getPartNextPartNo(params).then(({data}) => {
  4016. if (data && data.code === 0) {
  4017. this.$set(this.rohsCreatePartData, 'partNo', data.rows || '')
  4018. this.$set(this.rohsCreatePartData, 'ifsPartNo', data.rows || '')
  4019. } else if (!silent) {
  4020. this.$message.error((data && data.msg) || '获取料号失败')
  4021. }
  4022. }).catch(() => {
  4023. if (!silent) {
  4024. this.$message.error('获取料号失败')
  4025. }
  4026. })
  4027. },
  4028. openRohsCreatePartBaseList (tagNo) {
  4029. if (!this.rohsCreatePartDialogFlag) {
  4030. return
  4031. }
  4032. this.rohsCreatePartTagNo = tagNo
  4033. this.$nextTick(() => {
  4034. let strVal = ''
  4035. if (tagNo === 1007) {
  4036. strVal = this.rohsCreatePartData.umId
  4037. } else if (tagNo === 108) {
  4038. strVal = this.rohsCreatePartData.familyId
  4039. } else if (tagNo === 109) {
  4040. strVal = this.rohsCreatePartData.groupId
  4041. } else if (tagNo === 112) {
  4042. strVal = this.rohsCreatePartData.productGroupId3
  4043. } else if (tagNo === 113) {
  4044. strVal = this.rohsCreatePartData.productGroupId4
  4045. } else if (tagNo === 123) {
  4046. strVal = this.rohsCreatePartData.hazardCode
  4047. } else if (tagNo === 124) {
  4048. strVal = this.rohsCreatePartData.assetClass
  4049. } else if (tagNo === 125) {
  4050. strVal = this.rohsCreatePartData.partStatus
  4051. } else if (tagNo === 126) {
  4052. strVal = this.rohsCreatePartData.abcClass
  4053. } else if (tagNo === 127) {
  4054. strVal = this.rohsCreatePartData.countryOfOrigin
  4055. } else if (tagNo === 128) {
  4056. strVal = this.rohsCreatePartData.regionOfOrigin
  4057. } else if (tagNo === 129) {
  4058. strVal = this.rohsCreatePartData.customsStatNo
  4059. } else if (tagNo === 131) {
  4060. strVal = this.rohsCreatePartData.partCostGroupId
  4061. } else if (tagNo === 20) {
  4062. strVal = this.rohsCreatePartData.codeNo
  4063. } else if (tagNo === 132) {
  4064. strVal = this.rohsCreatePartData.planningMethod
  4065. }
  4066. this.$refs.baseList.init(tagNo, strVal)
  4067. })
  4068. },
  4069. applyRohsCreatePartBaseData (val) {
  4070. if (this.rohsCreatePartTagNo === 1007) {
  4071. this.rohsCreatePartData.umId = val.um_id
  4072. this.rohsCreatePartData.umName = val.um_name
  4073. } else if (this.rohsCreatePartTagNo === 108) {
  4074. this.rohsCreatePartData.familyId = val.family_id
  4075. this.rohsCreatePartData.familyName = val.family_name
  4076. } else if (this.rohsCreatePartTagNo === 109) {
  4077. this.rohsCreatePartData.groupId = val.group_id
  4078. this.rohsCreatePartData.groupName = val.group_name
  4079. } else if (this.rohsCreatePartTagNo === 112) {
  4080. this.rohsCreatePartData.productGroupId3 = val.product_group_id
  4081. this.rohsCreatePartData.productGroupName3 = val.product_group_name
  4082. } else if (this.rohsCreatePartTagNo === 113) {
  4083. this.rohsCreatePartData.productGroupId4 = val.product_group_id
  4084. this.rohsCreatePartData.productGroupName4 = val.product_group_name
  4085. } else if (this.rohsCreatePartTagNo === 123) {
  4086. this.rohsCreatePartData.hazardCode = val.hazard_code
  4087. this.rohsCreatePartData.hazardDesc = val.hazard_desc
  4088. } else if (this.rohsCreatePartTagNo === 124) {
  4089. this.rohsCreatePartData.assetClass = val.asset_class
  4090. this.rohsCreatePartData.assetClassDesc = val.asset_class_desc
  4091. } else if (this.rohsCreatePartTagNo === 125) {
  4092. this.rohsCreatePartData.partStatus = val.part_status
  4093. this.rohsCreatePartData.partStatusDesc = val.part_status_desc
  4094. } else if (this.rohsCreatePartTagNo === 126) {
  4095. this.rohsCreatePartData.abcClass = val.abc_class
  4096. this.rohsCreatePartData.abcClassDesc = val.abc_class_desc
  4097. } else if (this.rohsCreatePartTagNo === 127) {
  4098. this.rohsCreatePartData.countryOfOrigin = val.country_of_origin
  4099. this.rohsCreatePartData.countryOfOriginDesc = val.country_of_origin_desc
  4100. } else if (this.rohsCreatePartTagNo === 128) {
  4101. this.rohsCreatePartData.regionOfOrigin = val.region_of_origin
  4102. this.rohsCreatePartData.regionOfOriginDesc = val.region_of_origin_desc
  4103. } else if (this.rohsCreatePartTagNo === 129) {
  4104. this.rohsCreatePartData.customsStatNo = val.customs_stat_no
  4105. this.rohsCreatePartData.customsStatDesc = val.customs_stat_desc
  4106. } else if (this.rohsCreatePartTagNo === 131) {
  4107. this.rohsCreatePartData.partCostGroupId = val.part_cost_group_id
  4108. this.rohsCreatePartData.partCostGroupDesc = val.part_cost_group_desc
  4109. } else if (this.rohsCreatePartTagNo === 20) {
  4110. this.rohsCreatePartData.codeNo = val.Code_no
  4111. this.rohsCreatePartData.codeDesc = val.Code_desc
  4112. this.loadRohsPartItemListByCodeNo()
  4113. } else if (this.rohsCreatePartTagNo === 132) {
  4114. this.rohsCreatePartData.planningMethod = val.planning_method
  4115. this.rohsCreatePartData.planningMethodDesc = val.planning_method_desc
  4116. }
  4117. this.rohsCreatePartTagNo = 0
  4118. },
  4119. rohsCreateBaseFieldBlur (tagNo, codeKey, descKey, queryField, resultCodeField, resultDescField, withSite = true) {
  4120. this.rohsCreatePartData[codeKey] = (this.rohsCreatePartData[codeKey] || '').replace(/[\s\u00A0\u3000\u200B]/g, '')
  4121. if (!this.rohsCreatePartData[codeKey]) {
  4122. this.rohsCreatePartData[descKey] = ''
  4123. return
  4124. }
  4125. const site = this.rohsCreatePartData.site || this.modalData.site || this.$store.state.user.site
  4126. let conditionSql = " and " + queryField + " = '" + this.rohsCreatePartData[codeKey] + "'"
  4127. if (withSite) {
  4128. conditionSql += " and site = '" + site + "'"
  4129. }
  4130. const tempData = {
  4131. tagno: tagNo,
  4132. conditionSql: conditionSql
  4133. }
  4134. verifyData(tempData).then(({data}) => {
  4135. if (data && data.code === 0 && data.baseListData.length > 0) {
  4136. this.rohsCreatePartData[codeKey] = data.baseListData[0][resultCodeField]
  4137. this.rohsCreatePartData[descKey] = data.baseListData[0][resultDescField]
  4138. } else {
  4139. this.rohsCreatePartData[descKey] = ''
  4140. }
  4141. }).catch(() => {
  4142. this.rohsCreatePartData[descKey] = ''
  4143. })
  4144. },
  4145. rohsCreateHazardCodeBlur (tagNo) {
  4146. this.rohsCreateBaseFieldBlur(tagNo, 'hazardCode', 'hazardDesc', 'hazard_code', 'hazard_code', 'hazard_desc')
  4147. },
  4148. rohsCreateProductGroupId4Blur (tagNo) {
  4149. this.rohsCreateBaseFieldBlur(tagNo, 'productGroupId4', 'productGroupName4', 'product_group_id', 'product_group_id', 'product_group_name')
  4150. },
  4151. rohsCreateProductGroupId3Blur (tagNo) {
  4152. this.rohsCreateBaseFieldBlur(tagNo, 'productGroupId3', 'productGroupName3', 'product_group_id', 'product_group_id', 'product_group_name')
  4153. },
  4154. rohsCreateUmIdBlur (tagNo) {
  4155. this.rohsCreateBaseFieldBlur(tagNo, 'umId', 'umName', 'um_id', 'um_id', 'um_name', false)
  4156. },
  4157. rohsCreateGroupIdBlur (tagNo) {
  4158. this.rohsCreateBaseFieldBlur(tagNo, 'groupId', 'groupName', 'group_id', 'group_id', 'group_name')
  4159. },
  4160. rohsCreateFamilyIdBlur (tagNo) {
  4161. this.rohsCreateBaseFieldBlur(tagNo, 'familyId', 'familyName', 'family_id', 'family_id', 'family_name')
  4162. },
  4163. rohsCreateAssetClassBlur (tagNo) {
  4164. this.rohsCreateBaseFieldBlur(tagNo, 'assetClass', 'assetClassDesc', 'asset_class', 'asset_class', 'asset_class_desc')
  4165. },
  4166. rohsCreatePartStatusBlur (tagNo) {
  4167. this.rohsCreateBaseFieldBlur(tagNo, 'partStatus', 'partStatusDesc', 'part_status', 'part_status', 'part_status_desc')
  4168. },
  4169. rohsCreateAbcClassBlur (tagNo) {
  4170. this.rohsCreateBaseFieldBlur(tagNo, 'abcClass', 'abcClassDesc', 'abc_class', 'abc_class', 'abc_class_desc')
  4171. },
  4172. rohsCreateCountryOfOriginBlur (tagNo) {
  4173. this.rohsCreateBaseFieldBlur(tagNo, 'countryOfOrigin', 'countryOfOriginDesc', 'country_of_origin', 'country_of_origin', 'country_of_origin_desc')
  4174. },
  4175. rohsCreateRegionOfOriginBlur (tagNo) {
  4176. this.rohsCreateBaseFieldBlur(tagNo, 'regionOfOrigin', 'regionOfOriginDesc', 'region_of_origin', 'region_of_origin', 'region_of_origin_desc')
  4177. },
  4178. rohsCreateCustomsStatNoBlur (tagNo) {
  4179. this.rohsCreateBaseFieldBlur(tagNo, 'customsStatNo', 'customsStatDesc', 'customs_stat_no', 'customs_stat_no', 'customs_stat_desc')
  4180. },
  4181. rohsCreatePartCostGroupIdBlur (tagNo) {
  4182. this.rohsCreateBaseFieldBlur(tagNo, 'partCostGroupId', 'partCostGroupDesc', 'part_cost_group_id', 'part_cost_group_id', 'part_cost_group_desc')
  4183. },
  4184. rohsCreatePlanningMethodBlur (tagNo) {
  4185. this.rohsCreateBaseFieldBlur(tagNo, 'planningMethod', 'planningMethodDesc', 'planning_method', 'planning_method', 'planning_method_desc')
  4186. },
  4187. rohsCreateCodeNoBlur (tagNo) {
  4188. this.rohsCreatePartData.codeNo = (this.rohsCreatePartData.codeNo || '').replace(/[\s\u00A0\u3000\u200B]/g, '')
  4189. if (!this.rohsCreatePartData.codeNo) {
  4190. this.rohsCreatePartData.codeDesc = ''
  4191. this.$set(this.rohsCreatePartData, 'partItemList', [])
  4192. this.rohsPartItemSelections = []
  4193. return
  4194. }
  4195. const site = this.rohsCreatePartData.site || this.modalData.site || this.$store.state.user.site
  4196. const tempData = {
  4197. tagno: tagNo,
  4198. conditionSql: " and Code_no = '" + this.rohsCreatePartData.codeNo + "'" + " and site = '" + site + "'"
  4199. }
  4200. verifyData(tempData).then(({data}) => {
  4201. if (data && data.code === 0 && data.baseListData.length > 0) {
  4202. this.rohsCreatePartData.codeNo = data.baseListData[0].Code_no
  4203. this.rohsCreatePartData.codeDesc = data.baseListData[0].Code_desc
  4204. this.loadRohsPartItemListByCodeNo()
  4205. } else {
  4206. this.rohsCreatePartData.codeDesc = ''
  4207. this.$set(this.rohsCreatePartData, 'partItemList', [])
  4208. this.rohsPartItemSelections = []
  4209. }
  4210. }).catch(() => {
  4211. this.rohsCreatePartData.codeDesc = ''
  4212. })
  4213. },
  4214. loadRohsPartItemListByCodeNo () {
  4215. if (!this.rohsCreatePartData.codeNo) {
  4216. this.$set(this.rohsCreatePartData, 'partItemList', [])
  4217. this.rohsPartItemSelections = []
  4218. return
  4219. }
  4220. const params = {
  4221. site: this.rohsCreatePartData.site || this.modalData.site || this.$store.state.user.site,
  4222. codeNo: this.rohsCreatePartData.codeNo,
  4223. recordType: 'IP'
  4224. }
  4225. getPartItemListByCodeNo(params).then(({data}) => {
  4226. if (data && data.code === 0) {
  4227. this.$set(this.rohsCreatePartData, 'partItemList', (data.rows || []).map(item => ({
  4228. ...item,
  4229. numValue: item.numValue === null ? undefined : item.numValue
  4230. })))
  4231. } else {
  4232. this.$set(this.rohsCreatePartData, 'partItemList', [])
  4233. }
  4234. this.rohsPartItemSelections = []
  4235. }).catch(() => {
  4236. this.$set(this.rohsCreatePartData, 'partItemList', [])
  4237. this.rohsPartItemSelections = []
  4238. })
  4239. },
  4240. rohsPartItemSelectionChange (selection) {
  4241. this.rohsPartItemSelections = selection || []
  4242. },
  4243. openRohsCharacteristicDialog () {
  4244. this.rohsCharacteristicSelections = []
  4245. this.rohsCharacteristicQueryData = {
  4246. propertiesItemNo: '',
  4247. itemDesc: ''
  4248. }
  4249. this.queryRohsCharacteristicOptions()
  4250. this.rohsCharacteristicDialogFlag = true
  4251. },
  4252. removeRohsPartItemRows () {
  4253. if (!this.rohsPartItemSelections || this.rohsPartItemSelections.length === 0) {
  4254. this.$message.warning('请选择要删除的属性!')
  4255. return
  4256. }
  4257. this.$confirm('请是否确认删除该属性记录?', '提示', {
  4258. confirmButtonText: '确定',
  4259. cancelButtonText: '取消',
  4260. type: 'warning'
  4261. }).then(() => {
  4262. const removeSet = new Set(this.rohsPartItemSelections.map(item => item.propertiesItemNo))
  4263. this.$set(this.rohsCreatePartData, 'partItemList', (this.rohsCreatePartData.partItemList || []).filter(item => !removeSet.has(item.propertiesItemNo)))
  4264. this.rohsPartItemSelections = []
  4265. }).catch(() => {})
  4266. },
  4267. queryRohsCharacteristicOptions () {
  4268. const itemNos = (this.rohsCreatePartData.partItemList || []).map(item => item.propertiesItemNo).filter(item => item).join(',')
  4269. const params = {
  4270. site: this.rohsCreatePartData.site || this.modalData.site || this.$store.state.user.site,
  4271. recordType: 'IP',
  4272. propertiesItemNo: this.rohsCharacteristicQueryData.propertiesItemNo,
  4273. itemDesc: this.rohsCharacteristicQueryData.itemDesc,
  4274. itemNos: itemNos
  4275. }
  4276. getPartItemExclusionAlreadyExists(params).then(({data}) => {
  4277. if (data && data.code === 0) {
  4278. this.rohsCharacteristicList = data.rows || []
  4279. } else {
  4280. this.rohsCharacteristicList = []
  4281. }
  4282. }).catch(() => {
  4283. this.rohsCharacteristicList = []
  4284. })
  4285. },
  4286. rohsCharacteristicRowClick (row) {
  4287. if (this.$refs.rohsCharacteristicTable) {
  4288. this.$refs.rohsCharacteristicTable.toggleRowSelection(row)
  4289. }
  4290. },
  4291. rohsCharacteristicSelectionChange (selection) {
  4292. this.rohsCharacteristicSelections = selection || []
  4293. },
  4294. saveRohsCharacteristics () {
  4295. if (!this.rohsCharacteristicSelections || this.rohsCharacteristicSelections.length === 0) {
  4296. this.$message.warning('请选择属性!')
  4297. return
  4298. }
  4299. const currentList = Array.isArray(this.rohsCreatePartData.partItemList) ? this.rohsCreatePartData.partItemList : []
  4300. const existSet = new Set(currentList.map(item => item.propertiesItemNo))
  4301. const appendList = this.rohsCharacteristicSelections.filter(item => item && item.propertiesItemNo && !existSet.has(item.propertiesItemNo)).map(item => ({
  4302. ...item,
  4303. numValue: item.numValue === null ? undefined : item.numValue
  4304. }))
  4305. if (appendList.length === 0) {
  4306. this.$message.warning('所选属性已存在')
  4307. return
  4308. }
  4309. this.$set(this.rohsCreatePartData, 'partItemList', [...currentList, ...appendList])
  4310. this.rohsCharacteristicDialogFlag = false
  4311. this.rohsCharacteristicSelections = []
  4312. },
  4313. validateRohsCreatePart () {
  4314. this.rohsCreatePartData.partNo = (this.rohsCreatePartData.partNo || '').replace(/[\s\u00A0\u3000\u200B]/g, '')
  4315. if (!this.rohsCreatePartData.partNo) {
  4316. this.$message.warning('请填写物料编码')
  4317. return false
  4318. }
  4319. if (!/^[A-Za-z0-9._-]+$/.test(this.rohsCreatePartData.partNo)) {
  4320. this.$message.warning('物料编码只能包含字母、数字、-、_、.')
  4321. return false
  4322. }
  4323. if (!this.rohsCreatePartData.partDesc || !String(this.rohsCreatePartData.partDesc).trim()) {
  4324. this.$message.warning('请填写物料名称')
  4325. return false
  4326. }
  4327. if (!this.rohsCreatePartData.partType) {
  4328. this.$message.warning('请选择零件类型')
  4329. return false
  4330. }
  4331. if (!this.rohsCreatePartData.umId) {
  4332. this.$message.warning('请选择计量单位')
  4333. return false
  4334. }
  4335. if (!this.rohsCreatePartData.productGroupId1 || !this.rohsCreatePartData.productGroupId2) {
  4336. this.$message.warning('请先在RoHS单据中维护商品组1/2')
  4337. return false
  4338. }
  4339. if (!this.rohsCreatePartData.productGroupId3) {
  4340. this.$message.warning('请选择会计组')
  4341. return false
  4342. }
  4343. if (!this.rohsCreatePartData.productGroupId4) {
  4344. this.$message.warning('请选择计划人')
  4345. return false
  4346. }
  4347. return true
  4348. },
  4349. appendCreatedPartToRohsMaterial (createdPart) {
  4350. const appendResult = this.appendMaterialRows([{
  4351. site: this.modalData.site,
  4352. referenceNo: this.modalData.referenceNo,
  4353. projectId: this.modalData.projectId,
  4354. testPartNo: createdPart.partNo,
  4355. finalPartNo: createdPart.partNo,
  4356. partDesc: createdPart.partDesc,
  4357. partStatus: createdPart.partStatus || 'A'
  4358. }])
  4359. if (!appendResult.appendedCount) {
  4360. this.$message.warning('IFS料号创建成功,但该料号已存在于材料列表')
  4361. return Promise.resolve()
  4362. }
  4363. if (!this.shouldPersistMaterialsImmediately()) {
  4364. this.$set(this.modalData, 'materialList', appendResult.materialList)
  4365. this.$message.success('IFS料号创建成功,已加入材料列表')
  4366. return Promise.resolve()
  4367. }
  4368. return this.persistMaterialList(appendResult.materialList, 'IFS料号创建成功并已关联到RoHS材料')
  4369. },
  4370. saveRohsCreatePart () {
  4371. if (!this.validateRohsCreatePart()) {
  4372. return
  4373. }
  4374. const payload = {
  4375. ...this.rohsCreatePartData,
  4376. site: this.modalData.site || this.$store.state.user.site,
  4377. buNo: this.modalData.process || '',
  4378. createBy: this.$store.state.user.name || '',
  4379. updateBy: this.$store.state.user.name || '',
  4380. partDesc: (this.rohsCreatePartData.partDesc || '').trim(),
  4381. productGroupId1: this.modalData.commGroup1 || this.rohsCreatePartData.productGroupId1,
  4382. productGroupName1: this.modalData.commGroup1Desc || this.rohsCreatePartData.productGroupName1,
  4383. productGroupId2: this.modalData.commGroup2 || this.rohsCreatePartData.productGroupId2,
  4384. productGroupName2: this.modalData.commGroup2Desc || this.rohsCreatePartData.productGroupName2,
  4385. productGroupId3: this.rohsCreatePartData.productGroupId3,
  4386. productGroupName3: this.rohsCreatePartData.productGroupName3,
  4387. commGroup3: this.modalData.commGroup3 || this.rohsCreatePartData.commGroup3,
  4388. commGroup3Desc: this.modalData.commGroup3Desc || this.rohsCreatePartData.commGroup3Desc,
  4389. status: 'Y',
  4390. showInQueryFlag: 'Y',
  4391. temporaryPartFlag: 'N',
  4392. ifsPartNo: this.rohsCreatePartData.partNo,
  4393. plmPartNo: this.rohsCreatePartData.partNo,
  4394. partItemList: Array.isArray(this.rohsCreatePartData.partItemList) ? this.rohsCreatePartData.partItemList : []
  4395. }
  4396. this.rohsCreatePartLoading = true
  4397. createOfficialPartForRohs(payload).then(({data}) => {
  4398. if (data && data.code === 0) {
  4399. this.appendCreatedPartToRohsMaterial(payload).then(() => {
  4400. this.rohsCreatePartDialogFlag = false
  4401. })
  4402. } else {
  4403. this.$message.error((data && data.msg) || '创建IFS料号失败')
  4404. }
  4405. }).catch(() => {
  4406. this.$message.error('创建IFS料号失败')
  4407. }).finally(() => {
  4408. this.rohsCreatePartLoading = false
  4409. })
  4410. },
  4411. openProjectMaterialDialog () {
  4412. if (!this.canEditRohsMaterial()) {
  4413. this.$message.warning('当前状态不允许编辑材料')
  4414. return
  4415. }
  4416. this.projectMaterialDialogFlag = true
  4417. this.projectMaterialPageIndex = 1
  4418. this.searchProjectMaterialList()
  4419. },
  4420. searchProjectMaterialList () {
  4421. this.projectMaterialLoading = true
  4422. const params = {
  4423. page: this.projectMaterialPageIndex,
  4424. limit: this.projectMaterialPageSize,
  4425. site: this.$store.state.user.site,
  4426. partDesc: this.projectMaterialSearchData.partDesc,
  4427. finalPartNo: this.projectMaterialSearchData.finalPartNo,
  4428. partStatus: this.projectMaterialSearchData.partStatus
  4429. }
  4430. api.getRohsProjectMaterialList(params).then(({data}) => {
  4431. if (data && data.code === 0 && data.page) {
  4432. this.projectMaterialList = data.page.list || []
  4433. this.projectMaterialTotal = data.page.totalCount || 0
  4434. this.$nextTick(() => {
  4435. if (this.$refs.projectMaterialTable) {
  4436. this.$refs.projectMaterialTable.clearSelection()
  4437. }
  4438. })
  4439. } else {
  4440. this.projectMaterialList = []
  4441. this.projectMaterialTotal = 0
  4442. this.$message.error(data.msg || '物料查询失败')
  4443. }
  4444. this.projectMaterialLoading = false
  4445. }).catch(() => {
  4446. this.projectMaterialList = []
  4447. this.projectMaterialTotal = 0
  4448. this.projectMaterialLoading = false
  4449. })
  4450. },
  4451. projectMaterialSelectionChange (rows) {
  4452. this.projectMaterialSelections = rows || []
  4453. },
  4454. projectMaterialSizeChangeHandle (val) {
  4455. this.projectMaterialPageSize = val
  4456. this.projectMaterialPageIndex = 1
  4457. this.searchProjectMaterialList()
  4458. },
  4459. projectMaterialCurrentChangeHandle (val) {
  4460. this.projectMaterialPageIndex = val
  4461. this.searchProjectMaterialList()
  4462. },
  4463. confirmProjectMaterialSelection () {
  4464. if (!this.canEditRohsMaterial()) {
  4465. this.$message.warning('当前状态不允许编辑材料')
  4466. return
  4467. }
  4468. if (!this.projectMaterialSelections || this.projectMaterialSelections.length === 0) {
  4469. this.$message.warning('请至少选择一条物料')
  4470. return
  4471. }
  4472. const appendResult = this.appendMaterialRows(this.projectMaterialSelections)
  4473. if (!appendResult.appendedCount) {
  4474. this.$message.warning('所选物料已存在,未新增数据')
  4475. return
  4476. }
  4477. if (!this.shouldPersistMaterialsImmediately()) {
  4478. this.$set(this.modalData, 'materialList', appendResult.materialList)
  4479. this.projectMaterialDialogFlag = false
  4480. this.$message.success('已加入材料列表,保存单据后写入数据库')
  4481. return
  4482. }
  4483. this.$confirm('确认新增选中材料?', '提示', {
  4484. confirmButtonText: '确定',
  4485. cancelButtonText: '取消',
  4486. type: 'warning'
  4487. }).then(() => {
  4488. this.persistMaterialList(appendResult.materialList, '新增材料成功', () => {
  4489. this.projectMaterialDialogFlag = false
  4490. this.projectMaterialSelections = []
  4491. if (this.$refs.projectMaterialTable) {
  4492. this.$refs.projectMaterialTable.clearSelection()
  4493. }
  4494. })
  4495. }).catch(() => {})
  4496. },
  4497. appendMaterialRows (rows) {
  4498. const materialList = Array.isArray(this.modalData.materialList) ? [...this.modalData.materialList] : []
  4499. const exists = new Set(materialList.map(item => item.testPartNo))
  4500. let appendedCount = 0
  4501. rows.forEach(row => {
  4502. const testPartNo = row.testPartNo || row.test_part_no
  4503. if (!testPartNo || exists.has(testPartNo)) {
  4504. return
  4505. }
  4506. exists.add(testPartNo)
  4507. appendedCount++
  4508. materialList.push({
  4509. site: this.modalData.site,
  4510. referenceNo: this.modalData.referenceNo,
  4511. projectId: this.modalData.projectId,
  4512. testPartNo: testPartNo,
  4513. finalPartNo: row.finalPartNo || row.final_part_no || '',
  4514. partDesc: row.partDesc || row.part_desc || '',
  4515. partStatus: row.partStatus || row.part_status || ''
  4516. })
  4517. })
  4518. return {
  4519. materialList,
  4520. appendedCount
  4521. }
  4522. },
  4523. materialSelectionChange (rows) {
  4524. this.materialSelections = rows || []
  4525. },
  4526. shouldPersistMaterialsImmediately () {
  4527. return this.modalTitle === 'RoHS 编辑' && this.modalData && this.modalData.referenceNo && !String(this.modalData.referenceNo).startsWith('TEMP-')
  4528. },
  4529. normalizeMaterialListForSave (materialList) {
  4530. return (materialList || []).map((item, index) => {
  4531. return {
  4532. site: item.site || this.modalData.site || '',
  4533. referenceNo: item.referenceNo || this.modalData.referenceNo || '',
  4534. projectId: item.projectId || this.modalData.projectId || '',
  4535. testPartNo: item.testPartNo || item.test_part_no || '',
  4536. finalPartNo: item.finalPartNo || item.final_part_no || '',
  4537. partDesc: item.partDesc || item.part_desc || '',
  4538. partStatus: item.partStatus || item.part_status || '',
  4539. lineNo: index + 1
  4540. }
  4541. }).filter(item => item.testPartNo)
  4542. },
  4543. persistMaterialList (materialList, successMsg, successCallback) {
  4544. const normalizedList = this.normalizeMaterialListForSave(materialList)
  4545. const payload = {
  4546. site: this.modalData.site,
  4547. referenceNo: this.modalData.referenceNo,
  4548. projectId: this.modalData.projectId,
  4549. materialList: normalizedList
  4550. }
  4551. return api.updateRohsMaterials(payload).then(({data}) => {
  4552. if (data && data.code === 0) {
  4553. this.$set(this.modalData, 'materialList', normalizedList)
  4554. this.materialSelections = []
  4555. if (this.currentRow && this.currentRow.referenceNo === this.modalData.referenceNo) {
  4556. this.$set(this.currentRow, 'materialList', normalizedList)
  4557. }
  4558. this.$message.success(successMsg || '保存成功')
  4559. if (typeof successCallback === 'function') {
  4560. successCallback()
  4561. }
  4562. } else {
  4563. this.$message.error((data && data.msg) || '保存失败')
  4564. }
  4565. }).catch(() => {
  4566. this.$message.error('保存失败')
  4567. })
  4568. },
  4569. removeSelectedMaterialRows () {
  4570. if (!this.canEditRohsMaterial()) {
  4571. this.$message.warning('当前状态不允许编辑材料')
  4572. return
  4573. }
  4574. if (!this.materialSelections || this.materialSelections.length === 0) {
  4575. this.$message.warning('请先选择要删除的材料')
  4576. return
  4577. }
  4578. const removeSet = new Set(this.materialSelections.map(item => item.testPartNo))
  4579. const materialList = (this.modalData.materialList || []).filter(item => !removeSet.has(item.testPartNo))
  4580. if (!this.shouldPersistMaterialsImmediately()) {
  4581. this.$set(this.modalData, 'materialList', materialList)
  4582. this.materialSelections = []
  4583. this.$message.success('已删除材料,保存单据后写入数据库')
  4584. return
  4585. }
  4586. this.$confirm('确认删除选中材料?', '提示', {
  4587. confirmButtonText: '确定',
  4588. cancelButtonText: '取消',
  4589. type: 'warning'
  4590. }).then(() => {
  4591. this.persistMaterialList(materialList, '删除材料成功')
  4592. }).catch(() => {})
  4593. },
  4594. // ======== chooseList相关方法 ========
  4595. // 获取基础数据列表
  4596. getBaseList (val, type) {
  4597. this.tagNo = val
  4598. this.tagNo1 = type
  4599. this.$nextTick(() => {
  4600. let strVal = ''
  4601. let conSql = ''
  4602. if (val === 102) {
  4603. if (type === 1) {
  4604. strVal = this.modalData.endCustomer
  4605. conSql = " order by Customer_no "
  4606. }
  4607. }
  4608. if (val === 103 || val === 2001 || val === 2054) {
  4609. if (type === 1) {
  4610. strVal = this.modalData.applicant
  4611. } else if (type === 3) {
  4612. strVal = this.modalData.npdEngineer
  4613. } else if (type === 4) {
  4614. strVal = this.modalData.technicalPlan
  4615. } else if (type === 5) {
  4616. strVal = this.modalData.pm
  4617. }
  4618. conSql = " and b.site = '" + this.$store.state.user.site + "'"
  4619. }
  4620. if (val === 2000) {
  4621. strVal = this.modalData.buyer
  4622. conSql = " and b.site = '" + this.$store.state.user.site + "'"
  4623. }
  4624. if (val === 110) {
  4625. strVal = this.modalData.commGroup1
  4626. }
  4627. if (val === 111) {
  4628. strVal = this.modalData.commGroup2
  4629. }
  4630. if (val === 130) {
  4631. strVal = this.modalData.commGroup3
  4632. }
  4633. this.$refs.baseList.init(val, strVal, conSql)
  4634. })
  4635. },
  4636. // 列表方法的回调
  4637. getBaseData (val) {
  4638. if (this.rohsCreatePartDialogFlag && this.rohsCreatePartTagNo) {
  4639. this.applyRohsCreatePartBaseData(val)
  4640. return
  4641. }
  4642. if (this.tagNo === 102) {
  4643. if (this.tagNo1 === 1) {
  4644. if (val.Customer_no === this.modalData.endCustomer) {
  4645. return
  4646. }
  4647. if (this.modalData.projectIdFlag) {
  4648. this.modalData.projectIdFlag = false
  4649. }
  4650. this.modalData.endCustomer = val.Customer_no
  4651. this.modalData.endCustomerName = val.Customer_desc
  4652. this.modalData.projectId = ''
  4653. this.modalData.projectName = ''
  4654. this.$set(this.modalData, 'materialList', [])
  4655. }
  4656. }
  4657. if (this.tagNo === 103 || this.tagNo === 2001 || this.tagNo === 2054) {
  4658. if (this.tagNo1 === 1) {
  4659. this.modalData.applicant = val.username
  4660. this.modalData.applicantName = val.user_display
  4661. } else if (this.tagNo1 === 3) {
  4662. this.modalData.npdEngineer = val.username
  4663. this.modalData.npdEngineerName = val.user_display
  4664. } else if (this.tagNo1 === 4) {
  4665. this.modalData.technicalPlan = val.username
  4666. this.modalData.technicalPlanName = val.user_display
  4667. } else if (this.tagNo1 === 5) {
  4668. this.modalData.pm = val.username
  4669. this.modalData.pmName = val.user_display
  4670. }
  4671. }
  4672. if (this.tagNo === 110) {
  4673. this.modalData.commGroup1 = val.product_group_id
  4674. this.modalData.commGroup1Desc = val.product_group_name
  4675. }
  4676. if (this.tagNo === 111) {
  4677. this.modalData.commGroup2 = val.product_group_id
  4678. this.modalData.commGroup2Desc = val.product_group_name
  4679. }
  4680. if (this.tagNo === 130) {
  4681. this.modalData.commGroup3 = val.product_group_id
  4682. this.modalData.commGroup3Desc = val.product_group_name
  4683. }
  4684. if (this.tagNo === 2000) {
  4685. this.modalData.buyer = val.username
  4686. this.modalData.buyerName = val.user_display
  4687. }
  4688. },
  4689. handleQueryCustomer() {
  4690. if (!this.modalData.endCustomer) {
  4691. this.modalData.endCustomerName = ''
  4692. this.modalData.projectId = ''
  4693. this.modalData.projectName = ''
  4694. this.modalData.projectIdFlag = true
  4695. this.$set(this.modalData, 'materialList', [])
  4696. return
  4697. }
  4698. let params = {
  4699. site: this.$store.state.user.site,
  4700. customerNo: this.modalData.endCustomer
  4701. }
  4702. queryCustomer(params).then(({data}) => {
  4703. if (data && data.code === 0) {
  4704. if (data.rows && data.rows.length === 1) {
  4705. const customer = data.rows[0]
  4706. this.modalData.endCustomerName = customer.customerDesc || customer.Customer_desc || customer.customerName || ''
  4707. this.modalData.projectIdFlag = !!this.modalData.endCustomerFlag
  4708. } else {
  4709. this.modalData.endCustomerName = ''
  4710. this.modalData.projectId = ''
  4711. this.modalData.projectName = ''
  4712. this.modalData.projectIdFlag = true
  4713. this.$set(this.modalData, 'materialList', [])
  4714. }
  4715. } else {
  4716. this.modalData.endCustomerName = ''
  4717. this.modalData.projectId = ''
  4718. this.modalData.projectName = ''
  4719. this.modalData.projectIdFlag = true
  4720. this.$set(this.modalData, 'materialList', [])
  4721. }
  4722. }).catch((error) => {
  4723. this.modalData.endCustomerName = ''
  4724. this.modalData.projectId = ''
  4725. this.modalData.projectName = ''
  4726. this.modalData.projectIdFlag = true
  4727. this.$set(this.modalData, 'materialList', [])
  4728. })
  4729. },
  4730. handleQueryProjectByCustomer() {
  4731. if (!this.modalData.projectId) {
  4732. this.modalData.projectName = ''
  4733. return
  4734. }
  4735. let params = {
  4736. site: this.$store.state.user.site,
  4737. projectId: this.modalData.projectId
  4738. }
  4739. if (this.modalData.endCustomer) {
  4740. params.customerId = this.modalData.endCustomer
  4741. }
  4742. queryProjectByCustomer(params).then(({data}) => {
  4743. if (data && data.code === 0) {
  4744. if (data.rows && data.rows.length === 1) {
  4745. const project = data.rows[0]
  4746. this.modalData.projectName = project.projectName || project.Project_name || ''
  4747. } else {
  4748. this.modalData.projectName = ''
  4749. }
  4750. } else {
  4751. this.modalData.projectName = ''
  4752. }
  4753. }).catch((error) => {
  4754. this.modalData.projectName = ''
  4755. })
  4756. },
  4757. projectClickRow(row) {
  4758. const oldProjectId = this.modalData.projectId
  4759. this.modalData.projectId = row.projectId
  4760. this.modalData.projectName = row.projectName
  4761. if (this.modalData.endCustomer && this.modalData.endCustomer !== '') {
  4762. // do nothing
  4763. } else {
  4764. this.modalData.endCustomer = row.customerId
  4765. this.modalData.endCustomerName = row.customerName
  4766. }
  4767. if (oldProjectId && oldProjectId !== row.projectId) {
  4768. this.$set(this.modalData, 'materialList', [])
  4769. }
  4770. this.chooseProjectListFlag = false
  4771. },
  4772. searchProjectInfoList() {
  4773. this.projectList = [];
  4774. if (this.modalData.endCustomer && this.modalData.endCustomer !== '') {
  4775. this.searchProjectData.customerId = this.modalData.endCustomer
  4776. } else {
  4777. this.searchProjectData.customerId = undefined
  4778. }
  4779. this.searchProjectData.site = this.$store.state.user.site
  4780. searchProjectInfoList(this.searchProjectData).then(({data}) => {
  4781. if (data && data.code === 0) {
  4782. const rows = data.rows || []
  4783. this.projectList = rows
  4784. if ((!this.modalData.endCustomer || this.modalData.endCustomer === '') && rows.length > 0) {
  4785. this.modalData.projectId = rows[0].projectId
  4786. this.modalData.projectName = rows[0].projectName
  4787. this.modalData.endCustomer = rows[0].customerId
  4788. this.modalData.endCustomerName = rows[0].customerName
  4789. }
  4790. } else {
  4791. this.projectList = []
  4792. }
  4793. }).catch((error) => {
  4794. this.$message.error('查询项目信息失败')
  4795. })
  4796. },
  4797. closeProjectInfoDialog() {
  4798. if(this.$refs.closeProjectInfoForm) {
  4799. this.$refs.closeProjectInfoForm.resetFields();
  4800. }
  4801. this.searchProjectData = {
  4802. site: this.$store.state.user.site,
  4803. projectId: undefined,
  4804. projectName: undefined,
  4805. customerId: undefined,
  4806. }
  4807. },
  4808. // 申请人输入校验
  4809. applicantBlur (tagNo) {
  4810. if (this.modalData.applicant != null && this.modalData.applicant !== '') {
  4811. let tempData = {
  4812. tagno: tagNo,
  4813. conditionSql: " and a.username = '" + this.modalData.applicant + "'" + " and b.site = '" + this.$store.state.user.site + "'"
  4814. }
  4815. verifyData(tempData).then(({data}) => {
  4816. if (data && data.code === 0) {
  4817. if (data.baseListData.length > 0) {
  4818. this.modalData.applicant = data.baseListData[0].username
  4819. this.modalData.applicantName = data.baseListData[0].user_display
  4820. return
  4821. }
  4822. }
  4823. this.modalData.applicantName = ''
  4824. })
  4825. } else {
  4826. this.modalData.applicantName = ''
  4827. }
  4828. },
  4829. // PM输入校验
  4830. pmBlur (tagNo) {
  4831. if (this.modalData.pm != null && this.modalData.pm !== '') {
  4832. let tempData = {
  4833. tagno: tagNo,
  4834. conditionSql: " and a.username = '" + this.modalData.pm + "'" + " and b.site = '" + this.$store.state.user.site + "'"
  4835. }
  4836. verifyData(tempData).then(({data}) => {
  4837. if (data && data.code === 0) {
  4838. if (data.baseListData.length > 0) {
  4839. this.modalData.pm = data.baseListData[0].username
  4840. this.modalData.pmName = data.baseListData[0].user_display
  4841. return
  4842. }
  4843. }
  4844. this.modalData.pmName = ''
  4845. })
  4846. } else {
  4847. this.modalData.pmName = ''
  4848. }
  4849. },
  4850. // NPD工程师输入校验
  4851. npdEngineerBlur (tagNo) {
  4852. if (this.modalData.npdEngineer != null && this.modalData.npdEngineer !== '') {
  4853. let tempData = {
  4854. tagno: tagNo,
  4855. conditionSql: " and a.username = '" + this.modalData.npdEngineer + "'" + " and b.site = '" + this.$store.state.user.site + "'"
  4856. }
  4857. verifyData(tempData).then(({data}) => {
  4858. if (data && data.code === 0) {
  4859. if (data.baseListData.length > 0) {
  4860. this.modalData.npdEngineer = data.baseListData[0].username
  4861. this.modalData.npdEngineerName = data.baseListData[0].user_display
  4862. return
  4863. }
  4864. }
  4865. this.modalData.npdEngineerName = ''
  4866. })
  4867. } else {
  4868. this.modalData.npdEngineerName = ''
  4869. }
  4870. },
  4871. // 技术计划输入校验
  4872. technicalPlanBlur (tagNo) {
  4873. if (this.modalData.technicalPlan != null && this.modalData.technicalPlan !== '') {
  4874. let tempData = {
  4875. tagno: tagNo,
  4876. conditionSql: " and a.username = '" + this.modalData.technicalPlan + "'" + " and b.site = '" + this.$store.state.user.site + "'"
  4877. }
  4878. verifyData(tempData).then(({data}) => {
  4879. if (data && data.code === 0) {
  4880. if (data.baseListData.length > 0) {
  4881. this.modalData.technicalPlan = data.baseListData[0].username
  4882. this.modalData.technicalPlanName = data.baseListData[0].user_display
  4883. return
  4884. }
  4885. }
  4886. this.modalData.technicalPlanName = ''
  4887. })
  4888. } else {
  4889. this.modalData.technicalPlanName = ''
  4890. }
  4891. },
  4892. // 采购输入校验
  4893. buyerBlur (tagNo) {
  4894. if (this.modalData.buyer != null && this.modalData.buyer !== '') {
  4895. let tempData = {
  4896. tagno: tagNo,
  4897. conditionSql: " and a.username = '" + this.modalData.buyer + "'" + " and b.site = '" + this.$store.state.user.site + "'"
  4898. }
  4899. verifyData(tempData).then(({data}) => {
  4900. if (data && data.code === 0) {
  4901. if (data.baseListData.length > 0) {
  4902. this.modalData.buyer = data.baseListData[0].username
  4903. this.modalData.buyerName = data.baseListData[0].user_display
  4904. return
  4905. }
  4906. }
  4907. this.modalData.buyerName = ''
  4908. })
  4909. } else {
  4910. this.modalData.buyerName = ''
  4911. }
  4912. },
  4913. // 商品组1输入校验
  4914. commGroup1Blur (tagNo) {
  4915. if (this.modalData.commGroup1 != null && this.modalData.commGroup1 !== '') {
  4916. let tempData = {
  4917. tagno: tagNo,
  4918. conditionSql: " and product_group_id = '" + this.modalData.commGroup1 + "'" + " and site = '" + this.$store.state.user.site + "'"
  4919. }
  4920. verifyData(tempData).then(({data}) => {
  4921. if (data && data.code === 0 && data.baseListData.length > 0) {
  4922. this.modalData.commGroup1 = data.baseListData[0].product_group_id
  4923. this.modalData.commGroup1Desc = data.baseListData[0].product_group_name
  4924. } else {
  4925. this.modalData.commGroup1Desc = ''
  4926. }
  4927. })
  4928. } else {
  4929. this.modalData.commGroup1Desc = ''
  4930. }
  4931. },
  4932. // 商品组2输入校验
  4933. commGroup2Blur (tagNo) {
  4934. if (this.modalData.commGroup2 != null && this.modalData.commGroup2 !== '') {
  4935. let tempData = {
  4936. tagno: tagNo,
  4937. conditionSql: " and product_group_id = '" + this.modalData.commGroup2 + "'" + " and site = '" + this.$store.state.user.site + "'"
  4938. }
  4939. verifyData(tempData).then(({data}) => {
  4940. if (data && data.code === 0 && data.baseListData.length > 0) {
  4941. this.modalData.commGroup2 = data.baseListData[0].product_group_id
  4942. this.modalData.commGroup2Desc = data.baseListData[0].product_group_name
  4943. } else {
  4944. this.modalData.commGroup2Desc = ''
  4945. }
  4946. })
  4947. } else {
  4948. this.modalData.commGroup2Desc = ''
  4949. }
  4950. },
  4951. // 商品组3输入校验
  4952. commGroup3Blur (tagNo) {
  4953. if (this.modalData.commGroup3 != null && this.modalData.commGroup3 !== '') {
  4954. let tempData = {
  4955. tagno: tagNo,
  4956. conditionSql: " and product_group_id = '" + this.modalData.commGroup3 + "'" + " and site = '" + this.$store.state.user.site + "'"
  4957. }
  4958. verifyData(tempData).then(({data}) => {
  4959. if (data && data.code === 0 && data.baseListData.length > 0) {
  4960. this.modalData.commGroup3 = data.baseListData[0].product_group_id
  4961. this.modalData.commGroup3Desc = data.baseListData[0].product_group_name
  4962. } else {
  4963. this.modalData.commGroup3Desc = ''
  4964. }
  4965. })
  4966. } else {
  4967. this.modalData.commGroup3Desc = ''
  4968. }
  4969. }
  4970. }
  4971. }
  4972. </script>
  4973. <style scoped lang="scss">
  4974. /deep/ .customer-tab .el-tabs__content {
  4975. padding: 0 !important;
  4976. }
  4977. /deep/ .rohs-material-table .el-table__header-wrapper th > .cell {
  4978. white-space: nowrap;
  4979. word-break: keep-all;
  4980. }
  4981. /deep/ .rohs-multiple-two-rows.el-select .el-input__inner,
  4982. /deep/ .rohs-multiple-two-rows .el-select .el-input__inner {
  4983. min-height: 62px !important;
  4984. height: auto !important;
  4985. padding-top: 6px !important;
  4986. padding-bottom: 6px !important;
  4987. }
  4988. /deep/ .rohs-multiple-two-rows.el-select .el-select__tags,
  4989. /deep/ .rohs-multiple-two-rows .el-select .el-select__tags {
  4990. max-width: calc(100% - 34px) !important;
  4991. max-height: 50px;
  4992. overflow-y: auto;
  4993. overflow-x: hidden;
  4994. white-space: normal;
  4995. }
  4996. /deep/ .rohs-multiple-two-rows.el-select .el-select__tags > span,
  4997. /deep/ .rohs-multiple-two-rows .el-select .el-select__tags > span {
  4998. display: inline;
  4999. max-width: 100%;
  5000. white-space: normal;
  5001. }
  5002. /deep/ .rohs-multiple-two-rows.el-select .el-select__tags .el-tag,
  5003. /deep/ .rohs-multiple-two-rows .el-select .el-select__tags .el-tag {
  5004. display: inline-flex;
  5005. max-width: 100%;
  5006. height: auto;
  5007. line-height: 16px;
  5008. padding-top: 2px;
  5009. padding-bottom: 2px;
  5010. margin-right: 4px;
  5011. white-space: normal;
  5012. vertical-align: middle;
  5013. }
  5014. /deep/ .rohs-multiple-two-rows.el-select .el-select__tags .el-tag .el-select__tags-text,
  5015. /deep/ .rohs-multiple-two-rows .el-select .el-select__tags .el-tag .el-select__tags-text {
  5016. white-space: normal;
  5017. word-break: break-all;
  5018. }
  5019. </style>