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.

978 lines
39 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. <template>
  2. <div class="customer-css">
  3. <!-- 查询条件 -->
  4. <el-form :inline="true" label-position="top" class="pi-search-form">
  5. <el-form-item :label="'报价单号'">
  6. <el-input v-model="searchData.orderNo" placeholder="报价单号" style="width:160px" @keyup.enter.native="getList" />
  7. </el-form-item>
  8. <el-form-item :label="'物料编码'">
  9. <el-input v-model="searchData.partNo" placeholder="物料编码" style="width:160px" @keyup.enter.native="getList" />
  10. </el-form-item>
  11. <el-form-item :label="'物料名称'">
  12. <el-input v-model="searchData.partDesc" placeholder="物料名称" style="width:200px" @keyup.enter.native="getList" />
  13. </el-form-item>
  14. <el-form-item :label="'报价日期'">
  15. <el-date-picker
  16. style="width: 130px"
  17. v-model="searchData.startDate"
  18. type="date"
  19. format="yyyy-MM-dd"
  20. value-format="yyyy-MM-dd"
  21. placeholder="Start">
  22. </el-date-picker>
  23. </el-form-item>
  24. <el-form-item :label="'To'">
  25. <el-date-picker
  26. style="width: 130px"
  27. v-model="searchData.endDate"
  28. type="date"
  29. format="yyyy-MM-dd"
  30. value-format="yyyy-MM-dd"
  31. placeholder="End">
  32. </el-date-picker>
  33. </el-form-item>
  34. <el-form-item label=" ">
  35. <el-button type="primary" class="customer-bun-min" @click="getList">查询</el-button>
  36. <!-- <el-button type="primary" class="customer-bun-min" @click="openDialog()">新增报价</el-button> -->
  37. </el-form-item>
  38. </el-form>
  39. <!-- 列表 -->
  40. <el-table :data="dataList" :height="height" border ref="mainTable" highlight-current-row v-loading="loading" style="width:100%" stripe>
  41. <el-table-column fixed="right" :label="'操作'" header-align="center" align="center" width="140">
  42. <template slot-scope="scope">
  43. <a class="customer-a" v-if="scope.row.status === '已报价'" @click="openDialog(scope.row)">审批</a>
  44. <a class="customer-a" v-if="scope.row.status === '已接受'" @click="openPartDialog(scope.row)">可供物料</a>
  45. <!-- <a class="customer-a" @click="handleDelete(scope.row)">删除</a> -->
  46. </template>
  47. </el-table-column>
  48. <el-table-column prop="status" :label="'状态'" min-width="100" header-align="center" align="center">
  49. <template slot-scope="scope">
  50. {{ getStatusLabel(scope.row.status) }}
  51. <!-- <el-tag :type="getStatusType(scope.row.status)" size="small">{{ getStatusLabel(scope.row.status) }}</el-tag> -->
  52. </template>
  53. </el-table-column>
  54. <el-table-column prop="orderNo" :label="'报价单号'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  55. <el-table-column prop="itemNo" :label="'序号'" min-width="80" header-align="center" align="center" />
  56. <el-table-column prop="seqNo" :label="'报价次数'" min-width="100" header-align="center" align="center" />
  57. <el-table-column prop="createdDate" :label="'报价时间'" min-width="160" header-align="center" align="center" />
  58. <el-table-column prop="supplierId" :label="'供应商编码'" min-width="120" header-align="center" align="left" show-overflow-tooltip />
  59. <el-table-column prop="supplierName" :label="'供应商名称'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  60. <el-table-column prop="partNo" :label="'物料编码'" min-width="140" header-align="center" align="left" show-overflow-tooltip />
  61. <el-table-column prop="partDesc" :label="'物料名称'" min-width="180" header-align="center" align="left" show-overflow-tooltip />
  62. <el-table-column prop="qty" :label="'数量'" min-width="100" header-align="center" align="right" />
  63. <el-table-column prop="umid" :label="'计量单位'" min-width="100" header-align="center" align="center" />
  64. <el-table-column prop="remark2" :label="'特殊要求'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  65. <el-table-column prop="materialCost" :label="'材料费用'" min-width="120" header-align="center" align="right">
  66. <template slot-scope="scope">
  67. {{ formatMoney(scope.row.materialCost) }}
  68. </template>
  69. </el-table-column>
  70. <el-table-column prop="produceFee" :label="'加工费'" min-width="100" header-align="center" align="right">
  71. <template slot-scope="scope">
  72. {{ formatMoney(scope.row.produceFee) }}
  73. </template>
  74. </el-table-column>
  75. <el-table-column prop="surfaceFee" :label="'表面处理费'" min-width="120" header-align="center" align="right">
  76. <template slot-scope="scope">
  77. {{ formatMoney(scope.row.surfaceFee) }}
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="profit" :label="'利润'" min-width="100" header-align="center" align="right">
  81. <template slot-scope="scope">
  82. {{ formatMoney(scope.row.profit) }}
  83. </template>
  84. </el-table-column>
  85. <el-table-column prop="price" :label="'未税单价'" min-width="120" header-align="center" align="right">
  86. <template slot-scope="scope">
  87. {{ formatMoney(scope.row.price) }}
  88. </template>
  89. </el-table-column>
  90. <el-table-column prop="taxRate" :label="'税率(%)'" min-width="100" header-align="center" align="center" />
  91. <el-table-column prop="tax" :label="'含税单价'" min-width="120" header-align="center" align="right">
  92. <template slot-scope="scope">
  93. {{ formatMoney(scope.row.tax) }}
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="duty" :label="'关税'" min-width="100" header-align="center" align="right">
  97. <template slot-scope="scope">
  98. {{ formatMoney(scope.row.duty) }}
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="purchaseCycle" :label="'采购周期(天)'" min-width="120" header-align="center" align="center" />
  102. <el-table-column prop="mouldFee" :label="'模具费'" min-width="100" header-align="center" align="right">
  103. <template slot-scope="scope">
  104. {{ formatMoney(scope.row.mouldFee) }}
  105. </template>
  106. </el-table-column>
  107. <el-table-column prop="additionalCost" :label="'附加费用'" min-width="100" header-align="center" align="right">
  108. <template slot-scope="scope">
  109. {{ formatMoney(scope.row.additionalCost) }}
  110. </template>
  111. </el-table-column>
  112. <el-table-column prop="freight" :label="'运费'" min-width="100" header-align="center" align="right">
  113. <template slot-scope="scope">
  114. {{ formatMoney(scope.row.freight) }}
  115. </template>
  116. </el-table-column>
  117. <el-table-column prop="reason" :label="'原因'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  118. <el-table-column prop="remark" :label="'备注'" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  119. <el-table-column prop="createdBy" :label="'报价人'" min-width="120" header-align="center" align="center" />
  120. <el-table-column prop="wantReplyDate" :label="'要求报价时间'" min-width="160" header-align="center" align="center" />
  121. <el-table-column prop="buyer" :label="'采购员'" min-width="120" header-align="center" align="center" />
  122. <el-table-column prop="paymentTerm" :label="'付款方式'" min-width="120" header-align="center" align="center" />
  123. <el-table-column prop="deliveryTerm" :label="'交货条款'" min-width="120" header-align="center" align="center" />
  124. <el-table-column prop="currency" :label="'货币'" min-width="80" header-align="center" align="center" />
  125. <el-table-column prop="contact" :label="'联系人'" min-width="120" header-align="center" align="center" />
  126. <el-table-column prop="phoneNo" :label="'联系电话'" min-width="130" header-align="center" align="center" />
  127. <el-table-column prop="faxNo" :label="'传真'" min-width="130" header-align="center" align="center" />
  128. <el-table-column prop="otherCondition" :label="'其他要求'" min-width="180" header-align="center" align="left" show-overflow-tooltip />
  129. </el-table>
  130. <!-- 分页 -->
  131. <el-pagination
  132. style="margin-top:10px"
  133. @size-change="sizeChangeHandle"
  134. @current-change="currentChangeHandle"
  135. :current-page="pageIndex"
  136. :page-sizes="[20,50,100,200,500]"
  137. :page-size="pageSize"
  138. :total="totalPage"
  139. layout="total, sizes, prev, pager, next, jumper" />
  140. <!-- 标签页 -->
  141. <el-tabs v-model="activeName" style="margin-top: 0px; width: 99%;" @tab-click="tabClick" class="customer-tab" type="border-card">
  142. <el-tab-pane label="附件" name="attachments">
  143. <attachments ref="attachments" :height="tabHeight"></attachments>
  144. </el-tab-pane>
  145. </el-tabs>
  146. <!-- 新增 / 编辑 弹窗 -->
  147. <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="800px" :close-on-click-modal="false" v-drag>
  148. <el-form label-position="top" class="pi-form" :model="form" label-width="120px">
  149. <!-- 基础信息 -->
  150. <div class="form-section">
  151. <el-row :gutter="20">
  152. <el-col :span="6">
  153. <el-form-item label="物料编码" prop="partNo">
  154. <el-input v-model="form.partNo" :disabled="true" placeholder="物料编码"></el-input>
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="18">
  158. <el-form-item label="物料名称" prop="partDesc">
  159. <el-input v-model="form.partDesc" :disabled="true" placeholder="物料名称"></el-input>
  160. </el-form-item>
  161. </el-col>
  162. </el-row>
  163. <el-row :gutter="20">
  164. <el-col :span="18">
  165. <el-form-item label="规格型号" prop="spec">
  166. <el-input v-model="form.spec" :disabled="true" placeholder="规格型号"></el-input>
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="6">
  170. <el-form-item label="询价数量" prop="qty">
  171. <el-input-number v-model="form.qty" :disabled="true" :min="0" style="width: 100%"></el-input-number>
  172. </el-form-item>
  173. </el-col>
  174. </el-row>
  175. <el-row :gutter="20">
  176. <el-col :span="18">
  177. <el-form-item label="其他要求" prop="otherCondition">
  178. <el-input v-model="form.otherCondition" type="text" :disabled="true" :rows="1" placeholder="其他要求"></el-input>
  179. </el-form-item>
  180. </el-col>
  181. <el-col :span="6">
  182. <el-form-item label="计量单位" prop="umid">
  183. <el-input v-model="form.umid" :disabled="true" placeholder="计量单位"></el-input>
  184. </el-form-item>
  185. </el-col>
  186. </el-row>
  187. </div>
  188. <!-- 费用信息 -->
  189. <div class="form-section">
  190. <el-row :gutter="20">
  191. <el-col :span="6">
  192. <el-form-item label="材料费用" prop="materialCost">
  193. <el-input-number v-model="form.materialCost" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="6">
  197. <el-form-item label="加工费" prop="produceFee">
  198. <el-input-number v-model="form.produceFee" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="6">
  202. <el-form-item label="表面处理费" prop="surfaceFee">
  203. <el-input-number v-model="form.surfaceFee" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  204. </el-form-item>
  205. </el-col>
  206. <el-col :span="6">
  207. <el-form-item label="利润" prop="profit">
  208. <el-input-number v-model="form.profit" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  209. </el-form-item>
  210. </el-col>
  211. </el-row>
  212. <!-- 价格信息 -->
  213. <div class="form-section">
  214. <el-row :gutter="20">
  215. <el-col :span="6">
  216. <el-form-item label="未税单价" prop="price">
  217. <el-input-number v-model="form.price" :disabled="true" :precision="4" :min="0" style="width: 100%" ></el-input-number>
  218. </el-form-item>
  219. </el-col>
  220. <el-col :span="6">
  221. <el-form-item label="税率(%)" prop="taxRate">
  222. <el-input-number v-model="form.taxRate" :disabled="true" :precision="2" :min="0" :max="100" style="width: 100%" ></el-input-number>
  223. </el-form-item>
  224. </el-col>
  225. <el-col :span="6">
  226. <el-form-item label="含税单价" prop="tax">
  227. <el-input-number v-model="form.tax" :disabled="true" :precision="4" :min="0" style="width: 100%"></el-input-number>
  228. </el-form-item>
  229. </el-col>
  230. <el-col :span="6">
  231. <el-form-item label="关税" prop="duty">
  232. <el-input-number v-model="form.duty" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  233. </el-form-item>
  234. </el-col>
  235. </el-row>
  236. </div>
  237. <el-row :gutter="20">
  238. <el-col :span="6">
  239. <el-form-item label="采购周期(天)" prop="purchaseCycle">
  240. <el-input-number v-model="form.purchaseCycle" :disabled="true" :min="0" :precision="0" style="width: 100%"></el-input-number>
  241. </el-form-item>
  242. </el-col>
  243. <el-col :span="6">
  244. <el-form-item label="模具费" prop="mouldFee">
  245. <el-input-number v-model="form.mouldFee" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  246. </el-form-item>
  247. </el-col>
  248. <el-col :span="6">
  249. <el-form-item label="附加费用" prop="additionalCost">
  250. <el-input-number v-model="form.additionalCost" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  251. </el-form-item>
  252. </el-col>
  253. <el-col :span="6">
  254. <el-form-item label="运费" prop="freight">
  255. <el-input-number v-model="form.freight" :disabled="true" :precision="2" :min="0" style="width: 100%"></el-input-number>
  256. </el-form-item>
  257. </el-col>
  258. </el-row>
  259. </div>
  260. <!-- 其他信息 -->
  261. <div class="form-section">
  262. <el-row :gutter="20">
  263. <el-col :span="24">
  264. <el-form-item label="特殊要求" prop="remark2">
  265. <el-input v-model="form.remark2" type="textarea" :disabled="true" :rows="1" placeholder="请输入特殊要求"></el-input>
  266. </el-form-item>
  267. </el-col>
  268. </el-row>
  269. <el-row :gutter="20">
  270. <el-col :span="24">
  271. <el-form-item label="备注" prop="remark">
  272. <el-input v-model="form.remark" type="textarea" :disabled="true" :rows="1" placeholder="请输入备注"></el-input>
  273. </el-form-item>
  274. </el-col>
  275. </el-row>
  276. <el-row :gutter="20">
  277. <el-col :span="24">
  278. <el-form-item label="原因" prop="reason">
  279. <el-input v-model="form.reason" type="textarea" :rows="1" placeholder="请输入原因"></el-input>
  280. </el-form-item>
  281. </el-col>
  282. </el-row>
  283. </div>
  284. </el-form>
  285. <div slot="footer" class="dialog-footer" style="margin-top: 20px">
  286. <el-button type="primary" @click="accept" >已接受</el-button>
  287. <el-button type="primary" @click="notAccept" >未接受</el-button>
  288. <el-button type="primary" @click="refuse" >已拒绝</el-button>
  289. </div>
  290. </el-dialog>
  291. <!-- 可供物料弹窗 -->
  292. <el-dialog :title="partDialogTitle" :visible.sync="partDialogVisible" width="800px" :close-on-click-modal="false" v-drag>
  293. <el-form label-position="top" class="pi-form" :model="partForm" label-width="120px">
  294. <!-- 基础信息 -->
  295. <div class="form-section">
  296. <el-row :gutter="20">
  297. <el-col :span="6">
  298. <el-form-item label="物料编码" prop="partNo">
  299. <el-input v-model="partForm.partNo" disabled placeholder="物料编码"></el-input>
  300. </el-form-item>
  301. </el-col>
  302. <el-col :span="12">
  303. <el-form-item label="物料名称" prop="partDesc">
  304. <el-input v-model="partForm.partDesc" disabled placeholder="物料名称"></el-input>
  305. </el-form-item>
  306. </el-col>
  307. <el-col :span="6">
  308. <el-form-item label="主供应商" prop="isMainSupplier">
  309. <el-select v-model="partForm.isMainSupplier" placeholder="请选择" style="width: 100%">
  310. <el-option label="是" value="Y"></el-option>
  311. <el-option label="否" value="N"></el-option>
  312. </el-select>
  313. </el-form-item>
  314. </el-col>
  315. </el-row>
  316. <el-row :gutter="20">
  317. <el-col :span="6">
  318. <el-form-item label="供应商编码" prop="supplierCode">
  319. <el-input v-model="partForm.supplierCode" disabled placeholder="供应商编码"></el-input>
  320. </el-form-item>
  321. </el-col>
  322. <el-col :span="12">
  323. <el-form-item label="供应商名称" prop="supplierName">
  324. <el-input v-model="partForm.supplierName" disabled placeholder="供应商名称"></el-input>
  325. </el-form-item>
  326. </el-col>
  327. <el-col :span="6">
  328. <el-form-item label="是否在用" prop="active">
  329. <el-select v-model="partForm.active" placeholder="请选择" style="width: 100%">
  330. <el-option label="是" value="Y"></el-option>
  331. <el-option label="否" value="N"></el-option>
  332. </el-select>
  333. </el-form-item>
  334. </el-col>
  335. </el-row>
  336. <el-row :gutter="20">
  337. <el-col :span="6">
  338. <el-form-item label="库存计量单位" prop="oldUmid">
  339. <el-input v-model="partForm.oldUmid" disabled placeholder="库存计量单位"></el-input>
  340. </el-form-item>
  341. </el-col>
  342. <el-col :span="12">
  343. <el-form-item label="采购员" prop="buyer">
  344. <el-input v-model="partForm.buyer" disabled placeholder="采购员"></el-input>
  345. </el-form-item>
  346. </el-col>
  347. <el-col :span="6">
  348. <el-form-item label="库存类型" prop="stockType">
  349. <el-select v-model="partForm.stockType" placeholder="请选择" style="width: 100%">
  350. <el-option label="正常库存" value="N"></el-option>
  351. <el-option label="供应商库存" value="S"></el-option>
  352. <el-option label="客户库存" value="C"></el-option>
  353. </el-select>
  354. </el-form-item>
  355. </el-col>
  356. </el-row>
  357. </div>
  358. <div class="form-section">
  359. <el-row :gutter="20">
  360. <el-col :span="6">
  361. <el-form-item label="采购计量单位" prop="purUmid">
  362. <el-input v-model="partForm.purUmid" disabled placeholder="采购计量单位"></el-input>
  363. </el-form-item>
  364. </el-col>
  365. <el-col :span="6">
  366. <el-form-item label="供应商物料编码" prop="supplierPartNo">
  367. <el-input v-model="partForm.supplierPartNo" disabled placeholder="供应商物料编码"></el-input>
  368. </el-form-item>
  369. </el-col>
  370. <el-col :span="6">
  371. <el-form-item label="税率" prop="taxCode">
  372. <el-input v-model="partForm.taxCode" disabled placeholder="税率"></el-input>
  373. </el-form-item>
  374. </el-col>
  375. <el-col :span="6">
  376. <el-form-item label="换算系数" prop="convertFactor">
  377. <el-input-number v-model="partForm.convertFactor" :precision="2" :min="0" style="width: 100%"></el-input-number>
  378. </el-form-item>
  379. </el-col>
  380. </el-row>
  381. <div class="form-section">
  382. <el-row :gutter="20">
  383. <el-col :span="6">
  384. <el-form-item label="标准包装量" prop="standardPackageQty">
  385. <el-input-number v-model="partForm.standardPackageQty" :precision="0" :min="0" style="width: 100%"></el-input-number>
  386. </el-form-item>
  387. </el-col>
  388. <el-col :span="6">
  389. <el-form-item label="含税价格" prop="price">
  390. <el-input-number v-model="partForm.price" disabled :precision="4" :min="0" style="width: 100%"></el-input-number>
  391. </el-form-item>
  392. </el-col>
  393. <el-col :span="6">
  394. <el-form-item label="供应商联系人" prop="supplierContact">
  395. <el-input v-model="partForm.supplierContact" placeholder="供应商联系人"></el-input>
  396. </el-form-item>
  397. </el-col>
  398. <el-col :span="6">
  399. <el-form-item label="内部提前期" prop="internalLeadTime">
  400. <el-input v-model="partForm.internalLeadTime" placeholder="内部提前期"></el-input>
  401. </el-form-item>
  402. </el-col>
  403. </el-row>
  404. </div>
  405. <el-row :gutter="20">
  406. <el-col :span="6">
  407. <el-form-item label="附加费用" prop="additionalCost">
  408. <el-input-number v-model="partForm.additionalCost" :precision="2" :min="0" style="width: 100%"></el-input-number>
  409. </el-form-item>
  410. </el-col>
  411. <el-col :span="6">
  412. <el-form-item label="采购提前期" prop="purLeadTime">
  413. <el-input-number v-model="partForm.purLeadTime" :precision="0" :min="0" style="width: 100%"></el-input-number>
  414. </el-form-item>
  415. </el-col>
  416. <el-col :span="6">
  417. <el-form-item label="货币" prop="currency">
  418. <el-input v-model="partForm.currency" disabled placeholder="货币"></el-input>
  419. </el-form-item>
  420. </el-col>
  421. <el-col :span="6">
  422. <el-form-item label="最小订单量" prop="minOrderQty">
  423. <el-input-number v-model="partForm.minOrderQty" :precision="0" :min="0" style="width: 100%"></el-input-number>
  424. </el-form-item>
  425. </el-col>
  426. </el-row>
  427. </div>
  428. <!-- 其他信息 -->
  429. <div class="form-section">
  430. <el-row :gutter="20">
  431. <el-col :span="24">
  432. <el-form-item label="备注" prop="remark">
  433. <el-input v-model="partForm.remark" type="textarea" :rows="1" placeholder="请输入备注"></el-input>
  434. </el-form-item>
  435. </el-col>
  436. </el-row>
  437. <el-row :gutter="20">
  438. <el-col :span="6">
  439. <el-form-item label="检验类型" prop="inspectType">
  440. <el-select v-model="partForm.inspectType" placeholder="请选择" style="width: 100%">
  441. <el-option label="直接入库" value="1"></el-option>
  442. <el-option label="检验后入库" value="2"></el-option>
  443. <el-option label="接收到到货区" value="3"></el-option>
  444. <el-option label="接收到到货区后检验" value="4"></el-option>
  445. </el-select>
  446. </el-form-item>
  447. </el-col>
  448. <el-col :span="6">
  449. <el-form-item label="检验方式" prop="inspectMethod">
  450. <el-select v-model="partForm.inspectMethod" placeholder="请选择" style="width: 100%">
  451. <el-option label="*" value="*"></el-option>
  452. <el-option label="全检" value="F"></el-option>
  453. <el-option label="数量抽检" value="Q"></el-option>
  454. <el-option label="比例抽检" value="P"></el-option>
  455. <el-option label="不固定抽检" value="V"></el-option>
  456. </el-select>
  457. </el-form-item>
  458. </el-col>
  459. <el-col :span="6">
  460. <el-form-item label="抽检数量" prop="inspectQty">
  461. <el-input-number v-model="partForm.inspectQty" :precision="0" :min="0" style="width: 100%"></el-input-number>
  462. </el-form-item>
  463. </el-col>
  464. <el-col :span="6">
  465. <el-form-item label="抽检比例" prop="inspectPercent">
  466. <el-input-number v-model="partForm.inspectPercent" :precision="2" :min="0" :max="100" style="width: 100%"></el-input-number>
  467. </el-form-item>
  468. </el-col>
  469. </el-row>
  470. <el-row :gutter="20">
  471. <el-col :span="6">
  472. <el-form-item label="检验水平" prop="inspectionLevelNo">
  473. <el-input v-model="partForm.inspectionLevelNo" placeholder="检验水平"></el-input>
  474. </el-form-item>
  475. </el-col>
  476. <el-col :span="6">
  477. <el-form-item label="自动关闭误差比例" prop="closeTolerance">
  478. <el-input-number v-model="partForm.closeTolerance" :precision="2" :min="0" style="width: 100%"></el-input-number>
  479. </el-form-item>
  480. </el-col>
  481. <el-col :span="6">
  482. <el-form-item label="允许超订单量入库" prop="overReceiveFlag">
  483. <el-select v-model="partForm.overReceiveFlag" placeholder="请选择" style="width: 100%">
  484. <el-option label="是" value="Y"></el-option>
  485. <el-option label="否" value="N"></el-option>
  486. </el-select>
  487. </el-form-item>
  488. </el-col>
  489. <el-col :span="6">
  490. <el-form-item label="允许超订单比例" prop="overReceiveTolerance">
  491. <el-input-number v-model="partForm.overReceiveTolerance" :precision="2" :min="0" style="width: 100%"></el-input-number>
  492. </el-form-item>
  493. </el-col>
  494. </el-row>
  495. </div>
  496. </el-form>
  497. <div slot="footer" class="dialog-footer" style="margin-top: 20px">
  498. <el-button type="primary" @click="savePart">保存</el-button>
  499. <el-button @click="partDialogVisible = false">取消</el-button>
  500. </div>
  501. </el-dialog>
  502. </div>
  503. </template>
  504. <script>
  505. import {
  506. searchPurReplyHistPage,
  507. createPurReplyHist,
  508. updatePurReplyHist,
  509. deletePurReplyHist,
  510. updatePurReplyHistStatus
  511. } from '@/api/supplier/purReplyHist.js'
  512. import {
  513. createPartSupplierRelation
  514. } from '../../../api/part/partSupplierRelation'
  515. import attachments from './com_inquiry_Attachments'
  516. export default {
  517. name: 'MyQuotation',
  518. components: {
  519. attachments
  520. },
  521. data() {
  522. return {
  523. height: 200,
  524. loading: false,
  525. submitLoading: false,
  526. dataList: [],
  527. pageIndex: 1,
  528. pageSize: 20,
  529. totalPage: 0,
  530. currentRow: {},
  531. activeName: 'attachments',
  532. searchData: {
  533. site: this.$store.state.user.site,
  534. createdBy: this.$store.state.user.name,
  535. orderNo: '',
  536. partNo: '',
  537. partDesc: '',
  538. status: ''
  539. },
  540. dialogVisible: false,
  541. dialogTitle: '新增报价',
  542. editMode: false,
  543. form: {
  544. id: '',
  545. status: 'pending',
  546. orderNo: '',
  547. itemNo: '',
  548. seqNo: '',
  549. createdDate: '',
  550. supplierId: '',
  551. supplierName: '',
  552. partNo: '',
  553. partDesc: '',
  554. qty: 0,
  555. umid: '',
  556. remark2: '',
  557. materialCost: 0,
  558. produceFee: 0,
  559. surfaceFee: 0,
  560. profit: 0,
  561. price: 0,
  562. taxRate: 13,
  563. tax: 0,
  564. duty: 0,
  565. purchaseCycle: 0,
  566. mouldFee: 0,
  567. additionalCost: 0,
  568. freight: 0,
  569. reason: '',
  570. remark: '',
  571. createdBy: this.$store.state.user.name,
  572. wantReplyDate: '',
  573. employeeName: '',
  574. paymentTerm: '',
  575. deliveryTerm: '',
  576. currency: 'CNY',
  577. contact: '',
  578. phoneNo: '',
  579. faxNo: '',
  580. otherCondition: '',
  581. actReplyComments: ''
  582. },
  583. partDialogVisible: false,
  584. partDialogTitle: '供应商可供物料',
  585. partForm: { // 独立管理可供物料表单数据
  586. id: '',
  587. partNo: '',
  588. partDesc: '',
  589. isMainSupplier: 'N',
  590. supplierCode: '',
  591. supplierName: '',
  592. active: 'Y',
  593. oldUmid: '',
  594. buyer: '',
  595. stockType: 'N',
  596. purUmid: '',
  597. supplierPartNo: '',
  598. taxCode: '',
  599. convertFactor: 1,
  600. standardPackageQty: 0,
  601. price: 0,
  602. supplierContact: '',
  603. internalLeadTime: '',
  604. additionalCost: 0,
  605. purLeadTime: 0,
  606. currency: 'CNY',
  607. minOrderQty: 0,
  608. remark: '',
  609. inspectType: '1',
  610. inspectMethod: '*',
  611. inspectQty: 0,
  612. inspectPercent: 0,
  613. inspectionLevelNo: '',
  614. closeTolerance: 0,
  615. overReceiveFlag: 'N',
  616. overReceiveTolerance: 0
  617. }
  618. }
  619. },
  620. mounted() {
  621. this.calcHeight()
  622. window.addEventListener('resize', this.calcHeight)
  623. this.getList()
  624. },
  625. beforeDestroy() {
  626. window.removeEventListener('resize', this.calcHeight)
  627. },
  628. methods: {
  629. calcHeight() {
  630. this.$nextTick(() => {
  631. // this.height = window.innerHeight - 212
  632. this.height = (window.innerHeight - 280) / 2
  633. this.tabHeight = this.height - 50
  634. this.refreshCurrentTabTable()
  635. })
  636. },
  637. refreshCurrentTabTable() {
  638. if (this.currentRow === '' || this.currentRow === null) {
  639. this.currentRow = {site: '', orderNo: ''}
  640. }
  641. if (this.activeName === 'attachments') {
  642. this.refreshAttachments()
  643. }
  644. },
  645. refreshAttachments () {
  646. console.log('刷新附件组件,当前行数据:', this.currentRow)
  647. let inData = {
  648. orderRef1: this.currentRow.site,
  649. orderRef2: this.currentRow.orderNo,
  650. orderRef3: this.currentRow.partNo,
  651. orderReftype: 'purQuotationDetail',
  652. height: this.tabHeight
  653. }
  654. this.$refs.attachments.init(inData)
  655. },
  656. getStatusType(status) {
  657. const map = {
  658. pending: 'warning',
  659. approved: 'success',
  660. rejected: 'danger'
  661. }
  662. return map[status] || 'info'
  663. },
  664. getStatusLabel(status) {
  665. const map = {
  666. pending: '待审核',
  667. approved: '已通过',
  668. rejected: '已拒绝'
  669. }
  670. return map[status] || status
  671. },
  672. formatMoney(value) {
  673. if (value === null || value === undefined) return '-'
  674. return new Intl.NumberFormat('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value)
  675. },
  676. getList() {
  677. this.loading = true
  678. const params = {
  679. limit: this.pageSize,
  680. page: this.pageIndex,
  681. ...this.searchData
  682. }
  683. searchPurReplyHistPage(params).then(({ data }) => {
  684. if (data.code === 0) {
  685. this.dataList = data.page.list
  686. this.pageIndex = data.page.currPage
  687. this.pageSize = data.page.pageSize
  688. this.totalPage = data.page.totalCount
  689. if (this.dataList.length > 0) {
  690. this.$refs.mainTable.setCurrentRow(this.dataList[0])
  691. console.log('默认选中第一行:', this.dataList[0])
  692. this.changeData(this.dataList[0])
  693. } else {
  694. this.changeData(null)
  695. }
  696. } else {
  697. this.$message.error((data && data.msg) || '获取列表失败')
  698. }
  699. this.loading = false
  700. }).catch(() => {
  701. this.loading = false
  702. this.$message.error('请求失败')
  703. })
  704. },
  705. changeData(row) {
  706. this.currentRow = row ? JSON.parse(JSON.stringify(row)) : { site: '', orderNo: '', itemNo: '' }
  707. console.log('选中行数据:', this.currentRow)
  708. this.refreshCurrentTabTable()
  709. },
  710. tabClick() {
  711. this.refreshCurrentTabTable()
  712. },
  713. sizeChangeHandle(val) {
  714. this.pageSize = val
  715. this.pageIndex = 1
  716. this.getList()
  717. },
  718. currentChangeHandle(val) {
  719. this.pageIndex = val
  720. this.getList()
  721. },
  722. openDialog(row) {
  723. if (row) {
  724. this.dialogTitle = '编辑报价'
  725. this.editMode = true
  726. this.form = { ...row }
  727. } else {
  728. this.dialogTitle = '新增报价'
  729. this.editMode = false
  730. this.form = {
  731. id: '',
  732. status: '已报价',
  733. orderNo: '',
  734. itemNo: '',
  735. seqNo: '',
  736. createdDate: new Date().toISOString(),
  737. supplierId: '',
  738. supplierName: '',
  739. partNo: '',
  740. partDesc: '',
  741. qty: 0,
  742. umid: '',
  743. remark2: '',
  744. materialCost: 0,
  745. produceFee: 0,
  746. surfaceFee: 0,
  747. profit: 0,
  748. price: 0,
  749. taxRate: 13,
  750. tax: 0,
  751. duty: 0,
  752. purchaseCycle: 0,
  753. mouldFee: 0,
  754. additionalCost: 0,
  755. freight: 0,
  756. reason: '',
  757. remark: '',
  758. createdBy: this.$store.state.user.name,
  759. wantReplyDate: '',
  760. employeeName: '',
  761. paymentTerm: '',
  762. deliveryTerm: '',
  763. currency: 'CNY',
  764. contact: '',
  765. phoneNo: '',
  766. faxNo: '',
  767. otherCondition: '',
  768. actReplyComments: ''
  769. }
  770. }
  771. this.dialogVisible = true
  772. },
  773. validateForm() {
  774. if (!this.form.partNo) {
  775. this.$message.warning('物料编码不能为空')
  776. return false
  777. }
  778. if (!this.form.partDesc) {
  779. this.$message.warning('物料名称不能为空')
  780. return false
  781. }
  782. return true
  783. },
  784. submitForm() {
  785. if (!this.validateForm()) return
  786. this.submitLoading = true
  787. const api = this.editMode ? updatePurReplyHist : createPurReplyHist
  788. api(this.form).then(({ data }) => {
  789. if (data && data.code === 0) {
  790. this.$message.success('保存成功')
  791. this.dialogVisible = false
  792. this.getList()
  793. } else {
  794. this.$message.error((data && data.msg) || '保存失败')
  795. }
  796. }).catch(err => {
  797. this.$message.error('请求失败: ' + err.message)
  798. }).finally(() => {
  799. this.submitLoading = false
  800. })
  801. },
  802. accept() {
  803. this.$confirm(`确定接受供应商报价?`, '提示', { type: 'warning' }).then(() => {
  804. updatePurReplyHistStatus({
  805. id: this.form.id,
  806. site: this.$store.state.user.site,
  807. itemNo: this.form.itemNo,
  808. orderNo: this.form.orderNo,
  809. status: '已接受'
  810. }).then(({ data }) => {
  811. if (data && data.code === 0) {
  812. this.$message.success('操作成功')
  813. this.dialogVisible = false
  814. this.getList()
  815. } else {
  816. this.$message.error((data && data.msg) || '操作失败')
  817. }
  818. }).catch(err => {
  819. this.$message.error('操作失败: ' + err.message)
  820. })
  821. }).catch(() => {})
  822. },
  823. notAccept(row) {
  824. //备注必填
  825. if (!this.form.reason) {
  826. this.$message.warning('原因不能为空')
  827. return false
  828. }
  829. this.$confirm(`确定不接受供应商报价?`, '提示', { type: 'warning' }).then(() => {
  830. updatePurReplyHistStatus({
  831. id: this.form.id,
  832. site: this.$store.state.user.site,
  833. itemNo: this.form.itemNo,
  834. orderNo: this.form.orderNo,
  835. status: '未接受',
  836. reason: this.form.reason
  837. }).then(({ data }) => {
  838. if (data && data.code === 0) {
  839. this.$message.success('操作成功')
  840. this.dialogVisible = false
  841. this.getList()
  842. } else {
  843. this.$message.error((data && data.msg) || '操作失败')
  844. }
  845. }).catch(err => {
  846. this.$message.error('操作失败: ' + err.message)
  847. })
  848. }).catch(() => {})
  849. },
  850. refuse(row) {
  851. //备注必填
  852. if (!this.form.reason) {
  853. this.$message.warning('原因不能为空')
  854. return false
  855. }
  856. this.$confirm(`确定拒绝供应商报价?`, '提示', { type: 'warning' }).then(() => {
  857. updatePurReplyHistStatus({
  858. id: this.form.id,
  859. site: this.$store.state.user.site,
  860. itemNo: this.form.itemNo,
  861. orderNo: this.form.orderNo,
  862. status: '已拒绝',
  863. reason: this.form.reason
  864. }).then(({ data }) => {
  865. if (data && data.code === 0) {
  866. this.$message.success('操作成功')
  867. this.dialogVisible = false
  868. this.getList()
  869. } else {
  870. this.$message.error((data && data.msg) || '操作失败')
  871. }
  872. }).catch(err => {
  873. this.$message.error('操作失败: ' + err.message)
  874. })
  875. }).catch(() => {})
  876. },
  877. handleDelete(row) {
  878. this.$confirm(`确定删除报价单: ${row.orderNo} ?`, '提示', { type: 'warning' }).then(() => {
  879. deletePurReplyHist({ id: row.id }).then(({ data }) => {
  880. if (data && data.code === 0) {
  881. this.$message.success('删除成功')
  882. this.getList()
  883. } else {
  884. this.$message.error((data && data.msg) || '删除失败')
  885. }
  886. }).catch(err => {
  887. this.$message.error('删除失败: ' + err.message)
  888. })
  889. }).catch(() => {})
  890. },
  891. openPartDialog(row) {
  892. if (row) {
  893. this.dialogTitle = '供应商可供物料'
  894. this.editMode = true
  895. this.partForm = {
  896. ...this.partForm, // 使用 data 中定义的默认值
  897. ...row,
  898. supplierCode: row.supplierId,
  899. oldUmid: row.umid
  900. }
  901. }
  902. this.partDialogVisible = true
  903. },
  904. savePart() {
  905. // 表单验证
  906. if (!this.partForm.partNo) {
  907. this.$message.warning('物料编码不能为空')
  908. return false
  909. }
  910. if (!this.partForm.supplierCode) {
  911. this.$message.warning('供应商编码不能为空')
  912. return false
  913. }
  914. this.submitLoading = true
  915. // 调用保存可供物料的 API(根据实际接口名称调整)
  916. createPartSupplierRelation(this.partForm).then(({ data }) => {
  917. if (data && data.code === 0) {
  918. this.$message.success('保存成功')
  919. this.partDialogVisible = false
  920. this.getList() // 刷新列表
  921. } else {
  922. this.$message.error((data && data.msg) || '保存失败')
  923. }
  924. }).catch(err => {
  925. this.$message.error('保存失败: ' + err.message)
  926. }).finally(() => {
  927. this.submitLoading = false
  928. })
  929. }
  930. }
  931. }
  932. </script>
  933. <style scoped>
  934. .pi-search-form { margin-top: 0; }
  935. .pi-form { margin-top: -5px; }
  936. .customer-a {
  937. cursor: pointer;
  938. color: #409EFF;
  939. margin: 0 4px;
  940. }
  941. .customer-a:hover {
  942. color: #66b1ff;
  943. }
  944. .customer-bun-min {
  945. margin-right: 10px;
  946. }
  947. </style>