saleAccountsReceivableDetail.vue 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <el-form
  5. :model="queryParams"
  6. ref="queryForm"
  7. size="small"
  8. :inline="true"
  9. v-show="showSearch"
  10. label-width="68px"
  11. >
  12. <el-col :span="7">
  13. <el-form-item label="客户名称" prop="customerId">
  14. <el-select
  15. v-model="queryParams.customerId"
  16. placeholder="请选择客户"
  17. clearable
  18. filterable
  19. @change="handleQuery"
  20. >
  21. <el-option
  22. v-for="item in customSelectData"
  23. :key="item.id"
  24. :label="item.customName"
  25. :value="item.id"
  26. >
  27. </el-option>
  28. </el-select>
  29. </el-form-item>
  30. </el-col>
  31. <!-- <el-form-item label="回单日期" prop="returnReceiptDate">
  32. <el-date-picker
  33. clearable
  34. v-model="queryParams.returnReceiptDate"
  35. type="date"
  36. value-format="yyyy-MM-dd"
  37. placeholder="请选择回单日期"
  38. >
  39. </el-date-picker>
  40. </el-form-item> -->
  41. <el-col :span="10">
  42. <el-form-item label="日期范围" prop="startTime">
  43. <el-date-picker
  44. v-model="timeRange"
  45. type="daterange"
  46. range-separator="至"
  47. start-placeholder="开始日期"
  48. end-placeholder="结束日期"
  49. @change="timeRangeChange"
  50. >
  51. </el-date-picker>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="7">
  55. <el-form-item label="备注" prop="accountsReceivableRemark">
  56. <el-input
  57. v-model="queryParams.accountsReceivableRemark"
  58. size="medium"
  59. clearable
  60. @keyup.enter.native="handleQuery"
  61. ></el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="账务类型" prop="accountingType">
  66. <el-select
  67. v-model="queryParams.accountingType"
  68. value-key=""
  69. placeholder="请选择账务类型"
  70. clearable
  71. filterable
  72. @change="handleQuery"
  73. >
  74. <el-option
  75. v-for="item in dict.type.accounting_type"
  76. :key="item.value"
  77. :label="item.label"
  78. :value="item.value"
  79. >
  80. </el-option>
  81. </el-select>
  82. </el-form-item>
  83. </el-col>
  84. <!-- <el-col :span="8">
  85. <el-form-item label="" prop="returnReceipt">
  86. <el-radio-group
  87. @change="handleQuery"
  88. v-model="queryParams.returnReceipt"
  89. >
  90. <el-radio :label="0">未收回单</el-radio>
  91. <el-radio :label="1">收到回单</el-radio>
  92. <el-radio :label="''">全部</el-radio>
  93. </el-radio-group>
  94. </el-form-item>
  95. </el-col> -->
  96. <el-col :span="8">
  97. <el-form-item class="ml20" label="" prop="billingType">
  98. <el-radio-group
  99. @change="handleQuery"
  100. v-model="queryParams.billingType"
  101. >
  102. <el-radio :label="1">一类开票</el-radio>
  103. <el-radio :label="2">二类开票</el-radio>
  104. <el-radio :label="''">全部</el-radio>
  105. </el-radio-group>
  106. </el-form-item>
  107. </el-col>
  108. <el-col :span="8">
  109. <el-form-item>
  110. <el-button
  111. type="primary"
  112. icon="el-icon-search"
  113. size="mini"
  114. @click="handleQuery"
  115. >搜索</el-button
  116. >
  117. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  118. >重置</el-button
  119. >
  120. </el-form-item>
  121. </el-col>
  122. </el-form>
  123. </el-row>
  124. <el-row :gutter="10" class="mb8">
  125. <!-- <el-col :span="1.5">
  126. <el-button
  127. type="primary"
  128. plain
  129. icon="el-icon-plus"
  130. size="mini"
  131. @click="handleAdd"
  132. v-hasPermi="['system:SaleAccountsReceivableDetail:add']"
  133. >新增</el-button
  134. >
  135. </el-col>
  136. <el-col :span="1.5">
  137. <el-button
  138. type="success"
  139. plain
  140. icon="el-icon-edit"
  141. size="mini"
  142. :disabled="single"
  143. @click="handleUpdate"
  144. v-hasPermi="['system:SaleAccountsReceivableDetail:edit']"
  145. >修改</el-button
  146. >
  147. </el-col>
  148. <el-col :span="1.5">
  149. <el-button
  150. type="danger"
  151. plain
  152. icon="el-icon-delete"
  153. size="mini"
  154. :disabled="multiple"
  155. @click="handleDelete"
  156. v-hasPermi="['system:SaleAccountsReceivableDetail:remove']"
  157. >删除</el-button
  158. >
  159. </el-col> -->
  160. <!-- :disabled="multiple" -->
  161. <!-- <el-col :span="1.5">
  162. <el-button
  163. type="primary"
  164. plain
  165. icon="el-icon-s-claim"
  166. size="mini"
  167. @click="handlerReceipt"
  168. >回单</el-button
  169. >
  170. </el-col> -->
  171. <el-col :span="1.5">
  172. <el-button
  173. type="warning"
  174. plain
  175. icon="el-icon-download"
  176. size="mini"
  177. @click="handleExport"
  178. v-hasPermi="['system:SaleAccountsReceivableDetail:export']"
  179. >导出</el-button
  180. >
  181. </el-col>
  182. <right-toolbar
  183. :showSearch.sync="showSearch"
  184. @queryTable="getList"
  185. ></right-toolbar>
  186. </el-row>
  187. <el-table
  188. v-loading="loading"
  189. :data="SaleAccountsReceivableDetailList"
  190. @selection-change="handleSelectionChange"
  191. @cell-click="cellClick"
  192. >
  193. <el-table-column type="selection" width="55" align="center" />
  194. <el-table-column label="账务类型" align="center" prop="accountingType">
  195. <template slot-scope="scope">
  196. {{ getDictLabel(scope.row.accountingType, "accounting_type") }}
  197. </template>
  198. </el-table-column>
  199. <el-table-column label="客户名称" align="center" prop="customName" />
  200. <el-table-column
  201. label="日期"
  202. align="center"
  203. prop="accountsReceivableDate"
  204. width="180"
  205. >
  206. <template slot-scope="scope">
  207. <span>{{
  208. parseTime(scope.row.accountsReceivableDate, "{y}-{m}-{d}")
  209. }}</span>
  210. </template>
  211. </el-table-column>
  212. <el-table-column label="销售单号" align="center" prop="saleNo" />
  213. <!-- <el-table-column label="产品编号" align="center" prop="productId" /> -->
  214. <el-table-column label="品名" align="center" prop="productName" />
  215. <el-table-column
  216. label="规格"
  217. align="center"
  218. prop="productSpecifications"
  219. />
  220. <el-table-column label="等级" align="center" prop="productLevel" />
  221. <el-table-column label="颜色" align="center" prop="productColour" />
  222. <el-table-column label="批号" align="center" prop="lotNumber" />
  223. <el-table-column label="箱数" align="center" prop="boxNum" />
  224. <el-table-column label="重量" align="center" prop="weight" />
  225. <el-table-column label="单价" align="center" prop="productPrice" />
  226. <el-table-column label="应收" align="center" prop="amountReceivable" />
  227. <el-table-column label="已收" align="center" prop="receivedAmount" />
  228. <el-table-column label="余额" align="center" prop="amounts" />
  229. <el-table-column label="付款方式" align="center" prop="paymentMethod">
  230. <template slot-scope="scope">{{
  231. getDictLabel(
  232. scope.row.paymentMethod,
  233. "collection_registration_payment_method"
  234. )
  235. }}</template>
  236. </el-table-column>
  237. <el-table-column label="开票类型" align="center" prop="billingType">
  238. <template slot-scope="scope">
  239. {{
  240. getDictLabel(
  241. scope.row.billingType,
  242. "accounts_receivable_billing_type"
  243. )
  244. }}
  245. </template>
  246. </el-table-column>
  247. <el-table-column
  248. label="备注"
  249. align="center"
  250. prop="accountsReceivableRemark"
  251. />
  252. <el-table-column
  253. label="结算单位"
  254. align="center"
  255. prop="settlementUnitName"
  256. />
  257. <el-table-column label="通知单号" align="center" prop="noticeNumber" />
  258. <el-table-column label="开票" align="center" prop="billingFlag">
  259. <template slot-scope="scope">
  260. <el-checkbox
  261. true-label="1"
  262. false-label="0"
  263. v-model="scope.row.billingFlag"
  264. @change="billingFlagChange(scope.row)"
  265. ></el-checkbox>
  266. </template>
  267. </el-table-column>
  268. <el-table-column label="回单" align="center" prop="returnReceipt">
  269. <template slot-scope="scope">
  270. <el-checkbox
  271. true-label="1"
  272. false-label="0"
  273. v-model="scope.row.returnReceipt"
  274. @change="returnReceiptChange(scope.row)"
  275. ></el-checkbox>
  276. </template>
  277. </el-table-column>
  278. <el-table-column
  279. label="回单日期"
  280. align="center"
  281. prop="returnReceiptDate"
  282. width="180"
  283. >
  284. <template slot-scope="scope">
  285. <el-date-picker
  286. style="width: 150px"
  287. v-if="scope.row.returnReceiptDateShow"
  288. v-model="scope.row.returnReceiptDate"
  289. type="date"
  290. size="mini"
  291. placeholder="选择日期"
  292. value-format="yyyy-MM-dd"
  293. @change="returnReceiptChange(scope.row)"
  294. >
  295. </el-date-picker>
  296. <span v-else>{{
  297. parseTime(scope.row.returnReceiptDate, "{y}-{m}-{d}")
  298. }}</span>
  299. </template>
  300. </el-table-column>
  301. <el-table-column
  302. label="回单备注"
  303. align="center"
  304. width="100px"
  305. prop="returnReceiptRemark"
  306. >
  307. <template slot-scope="scope">
  308. <el-input
  309. style="width: 85px"
  310. v-if="scope.row.returnReceiptRemarkShow"
  311. v-model="scope.row.returnReceiptRemark"
  312. @blur="returnReceiptChange(scope.row)"
  313. size="mini"
  314. ></el-input>
  315. <span v-else>
  316. {{ scope.row.returnReceiptRemark }}
  317. </span>
  318. </template>
  319. </el-table-column>
  320. <!-- <el-table-column
  321. label="操作"
  322. align="center"
  323. class-name="small-padding fixed-width"
  324. >
  325. <template slot-scope="scope">
  326. <el-dropdown>
  327. <el-button type="warning" plain size="small">
  328. 操作<i class="el-icon-arrow-down el-icon--right"></i>
  329. </el-button>
  330. <el-dropdown-menu slot="dropdown">
  331. <el-dropdown-item
  332. ><el-button
  333. size="mini"
  334. type="text"
  335. @click="handlerReceipt(scope.row.id)"
  336. >回 单</el-button
  337. ></el-dropdown-item
  338. >
  339. </el-dropdown-menu>
  340. </el-dropdown>
  341. </template>
  342. </el-table-column> -->
  343. </el-table>
  344. <pagination
  345. v-show="total > 0"
  346. :total="total"
  347. :page.sync="queryParams.pageNum"
  348. :limit.sync="queryParams.pageSize"
  349. @pagination="getList"
  350. />
  351. <!-- 添加或修改应收账明细对话框 -->
  352. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  353. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  354. <el-form-item label="客户编号" prop="customerId">
  355. <el-input v-model="form.customerId" placeholder="请输入客户编号" />
  356. </el-form-item>
  357. <el-form-item label="应收账日期" prop="accountsReceivableDate">
  358. <el-date-picker
  359. clearable
  360. v-model="form.accountsReceivableDate"
  361. type="date"
  362. value-format="yyyy-MM-dd"
  363. placeholder="请选择应收账日期"
  364. >
  365. </el-date-picker>
  366. </el-form-item>
  367. <el-form-item label="销售单号" prop="saleNo">
  368. <el-input v-model="form.saleNo" placeholder="请输入销售单号" />
  369. </el-form-item>
  370. <el-form-item label="销售产品编号" prop="saleProductNo">
  371. <el-input
  372. v-model="form.saleProductNo"
  373. placeholder="请输入销售产品编号"
  374. />
  375. </el-form-item>
  376. <el-form-item label="产品编号" prop="productId">
  377. <el-input v-model="form.productId" placeholder="请输入产品编号" />
  378. </el-form-item>
  379. <el-form-item label="产品名称" prop="productName">
  380. <el-input v-model="form.productName" placeholder="请输入产品名称" />
  381. </el-form-item>
  382. <el-form-item label="产品规格" prop="productSpecifications">
  383. <el-input
  384. v-model="form.productSpecifications"
  385. placeholder="请输入产品规格"
  386. />
  387. </el-form-item>
  388. <el-form-item label="产品等级" prop="productLevel">
  389. <el-input v-model="form.productLevel" placeholder="请输入产品等级" />
  390. </el-form-item>
  391. <el-form-item label="产品颜色" prop="productColour">
  392. <el-input v-model="form.productColour" placeholder="请输入产品颜色" />
  393. </el-form-item>
  394. <el-form-item label="批号" prop="lotNumber">
  395. <el-input v-model="form.lotNumber" placeholder="请输入批号" />
  396. </el-form-item>
  397. <el-form-item label="箱数" prop="boxNum">
  398. <el-input v-model="form.boxNum" placeholder="请输入箱数" />
  399. </el-form-item>
  400. <el-form-item label="重量" prop="weight">
  401. <el-input v-model="form.weight" placeholder="请输入重量" />
  402. </el-form-item>
  403. <el-form-item label="产品单价" prop="productPrice">
  404. <el-input v-model="form.productPrice" placeholder="请输入产品单价" />
  405. </el-form-item>
  406. <el-form-item label="应收金额" prop="amountReceivable">
  407. <el-input
  408. v-model="form.amountReceivable"
  409. placeholder="请输入应收金额"
  410. />
  411. </el-form-item>
  412. <el-form-item label="已收金额" prop="receivedAmount">
  413. <el-input
  414. v-model="form.receivedAmount"
  415. placeholder="请输入已收金额"
  416. />
  417. </el-form-item>
  418. <el-form-item label="金额" prop="amounts">
  419. <el-input v-model="form.amounts" placeholder="请输入金额" />
  420. </el-form-item>
  421. <el-form-item label="付款方式" prop="paymentMethod">
  422. <el-input v-model="form.paymentMethod" placeholder="请输入付款方式" />
  423. </el-form-item>
  424. <el-form-item label="应收账备注" prop="accountsReceivableRemark">
  425. <el-input
  426. v-model="form.accountsReceivableRemark"
  427. placeholder="请输入应收账备注"
  428. />
  429. </el-form-item>
  430. <el-form-item label="结算单位" prop="settlementUnit">
  431. <el-input
  432. v-model="form.settlementUnit"
  433. placeholder="请输入结算单位"
  434. />
  435. </el-form-item>
  436. <el-form-item label="回单" prop="returnReceipt">
  437. <el-input v-model="form.returnReceipt" placeholder="请输入回单" />
  438. </el-form-item>
  439. <el-form-item label="回单日期" prop="returnReceiptDate">
  440. <el-date-picker
  441. clearable
  442. v-model="form.returnReceiptDate"
  443. type="date"
  444. value-format="yyyy-MM-dd"
  445. placeholder="请选择回单日期"
  446. >
  447. </el-date-picker>
  448. </el-form-item>
  449. <el-form-item label="回单备注" prop="returnReceiptRemark">
  450. <el-input
  451. v-model="form.returnReceiptRemark"
  452. placeholder="请输入回单备注"
  453. />
  454. </el-form-item>
  455. <el-form-item label="通知单号" prop="noticeNumber">
  456. <el-input v-model="form.noticeNumber" placeholder="请输入通知单号" />
  457. </el-form-item>
  458. <el-form-item label="备用列1" prop="spare1">
  459. <el-input v-model="form.spare1" placeholder="请输入备用列1" />
  460. </el-form-item>
  461. <el-form-item label="备用列2" prop="spare2">
  462. <el-input v-model="form.spare2" placeholder="请输入备用列2" />
  463. </el-form-item>
  464. <el-form-item label="备用列3" prop="spare3">
  465. <el-input v-model="form.spare3" placeholder="请输入备用列3" />
  466. </el-form-item>
  467. <el-form-item label="备注" prop="remark">
  468. <el-input v-model="form.remark" placeholder="请输入备注" />
  469. </el-form-item>
  470. <el-form-item label="创建者ID" prop="createById">
  471. <el-input v-model="form.createById" placeholder="请输入创建者ID" />
  472. </el-form-item>
  473. <el-form-item label="更新者ID" prop="updateById">
  474. <el-input v-model="form.updateById" placeholder="请输入更新者ID" />
  475. </el-form-item>
  476. <el-form-item label="删除标志" prop="delFlag">
  477. <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
  478. </el-form-item>
  479. </el-form>
  480. <div slot="footer" class="dialog-footer">
  481. <el-button type="primary" @click="submitForm">确 定</el-button>
  482. <el-button @click="cancel">取 消</el-button>
  483. </div>
  484. </el-dialog>
  485. <!-- 回单弹窗 -->
  486. <el-dialog title="回单登记" :visible.sync="receiptShow" width="500px">
  487. <el-form
  488. ref="returnReceiptForm"
  489. :model="returnReceiptForm"
  490. :rules="receiptFormrules"
  491. label-width="80px"
  492. >
  493. <el-form-item label="回单号" prop="receiptNo">
  494. <el-input
  495. v-model="returnReceiptForm.receiptNo"
  496. placeholder="请输入回单号"
  497. />
  498. </el-form-item>
  499. <el-form-item label="客户" prop="customId">
  500. <el-select
  501. v-model="returnReceiptForm.customId"
  502. placeholder="请选择回单客户"
  503. clearable
  504. filterable
  505. >
  506. <el-option
  507. v-for="item in customSelectData"
  508. :key="item.id"
  509. :label="item.customName"
  510. :value="item.id"
  511. >
  512. </el-option>
  513. </el-select>
  514. </el-form-item>
  515. <el-form-item label="收到回单" prop="isReceive">
  516. <el-radio-group v-model="returnReceiptForm.isReceive">
  517. <el-radio :label="true">是</el-radio>
  518. <el-radio :label="false">否</el-radio>
  519. </el-radio-group>
  520. </el-form-item>
  521. <el-form-item label="回单日期" prop="receiveDate">
  522. <el-date-picker
  523. v-model="returnReceiptForm.receiveDate"
  524. type="date"
  525. size="normal"
  526. placeholder="选择回单日期"
  527. >
  528. </el-date-picker>
  529. </el-form-item>
  530. <el-form-item label="备注" prop="receiveRemark">
  531. <el-input
  532. v-model="returnReceiptForm.receiveRemark"
  533. size="normal"
  534. clearable
  535. ></el-input>
  536. </el-form-item>
  537. </el-form>
  538. <div slot="footer" class="dialog-footer">
  539. <el-button @click="receiptShow = false">取 消</el-button>
  540. <el-button type="primary" @click="submitReceiptForm">确 定</el-button>
  541. </div>
  542. </el-dialog>
  543. <!-- 添加发票对话框 -->
  544. <el-dialog
  545. title="添加发票"
  546. :visible.sync="billingVisible"
  547. width="800px"
  548. append-to-body
  549. >
  550. <el-row :gutter="20">
  551. <el-form
  552. ref="billingForm"
  553. :model="billingForm"
  554. :rules="billingFormRules"
  555. label-width="80px"
  556. >
  557. <el-col :span="12">
  558. <el-form-item label="客户名称" prop="customerId">
  559. <el-select
  560. v-model="billingForm.customerId"
  561. placeholder="请选择客户"
  562. clearable
  563. filterable
  564. @change="getSettlementUnitList"
  565. >
  566. <el-option
  567. v-for="item in customSelectData"
  568. :key="item.id"
  569. :label="item.customName"
  570. :value="item.id"
  571. >
  572. </el-option>
  573. </el-select>
  574. </el-form-item>
  575. </el-col>
  576. <el-col :span="12">
  577. <el-form-item label="发票号" prop="invoiceNumber">
  578. <el-input
  579. v-model="billingForm.invoiceNumber"
  580. placeholder="请输入发票号"
  581. />
  582. </el-form-item>
  583. </el-col>
  584. <el-col :span="12">
  585. <el-form-item label="发票日期" prop="invoiceDate">
  586. <el-date-picker
  587. clearable
  588. v-model="billingForm.invoiceDate"
  589. type="date"
  590. value-format="yyyy-MM-dd"
  591. placeholder="请选择发票日期"
  592. >
  593. </el-date-picker>
  594. </el-form-item>
  595. </el-col>
  596. <el-col :span="12">
  597. <el-form-item label="发票类型" prop="invoiceType">
  598. <el-select
  599. v-model="billingForm.invoiceType"
  600. placeholder="请选择发票类型"
  601. clearable
  602. filterable
  603. >
  604. <el-option
  605. v-for="item in dict.type.finished_product_invoice_type"
  606. :key="item.value"
  607. :label="item.label"
  608. :value="item.value"
  609. >
  610. </el-option>
  611. </el-select>
  612. </el-form-item>
  613. </el-col>
  614. <el-col :span="12">
  615. <el-form-item label="开票金额" prop="billingAmount">
  616. <el-input
  617. v-model="billingForm.billingAmount"
  618. placeholder="请输入开票金额"
  619. />
  620. </el-form-item>
  621. </el-col>
  622. <el-col :span="12">
  623. <el-form-item label="经手人" prop="personInCharge">
  624. <el-input
  625. v-model="billingForm.personInCharge"
  626. placeholder="请输入经手人"
  627. />
  628. </el-form-item>
  629. </el-col>
  630. <el-col :span="24">
  631. <el-form-item label="结算单位" prop="settlementUnitId">
  632. <el-select
  633. v-model="billingForm.settlementUnitId"
  634. clearable
  635. filterable
  636. >
  637. <el-option
  638. v-for="item in settlementUnitList"
  639. :key="item.ids"
  640. :label="item.customerName"
  641. :value="item.id"
  642. >
  643. </el-option>
  644. </el-select>
  645. <el-button
  646. class="ml10"
  647. icon="el-icon-edit"
  648. @click="editSettleUnit"
  649. ></el-button>
  650. </el-form-item>
  651. </el-col>
  652. <el-col :span="24">
  653. <el-form-item label="备注" prop="remark">
  654. <el-input v-model="billingForm.remark" placeholder="请输入备注" />
  655. </el-form-item>
  656. </el-col>
  657. </el-form>
  658. </el-row>
  659. <el-dialog
  660. width="600px"
  661. :title="customName + '的结算单位'"
  662. :visible.sync="innerVisible"
  663. append-to-body
  664. >
  665. <el-button
  666. type="primary"
  667. size="small"
  668. @click="addSettleUnit"
  669. icon="el-icon-plus"
  670. :disabled="adding"
  671. >新增</el-button
  672. >
  673. <el-table :data="settleTableData" border stripe>
  674. <el-table-column type="index" width="50" />
  675. <el-table-column prop="customerName" label="单位名称">
  676. <template slot-scope="scope">
  677. <span v-if="!scope.row.isEdit">{{ scope.row.customerName }}</span>
  678. <el-input
  679. v-else
  680. v-model="scope.row.customerName"
  681. size="mini"
  682. ></el-input>
  683. </template>
  684. </el-table-column>
  685. <el-table-column prop="customerRegion" label="单位地区">
  686. <template slot-scope="scope">
  687. <span v-if="!scope.row.isEdit">{{
  688. scope.row.customerRegion
  689. }}</span>
  690. <el-input
  691. v-else
  692. v-model="scope.row.customerRegion"
  693. size="mini"
  694. ></el-input>
  695. </template>
  696. </el-table-column>
  697. <el-table-column label="操作">
  698. <template slot-scope="scope">
  699. <!-- 编辑 -->
  700. <div class="btn-wrap" v-show="scope.row.isEdit && scope.row.id">
  701. <el-button
  702. type="success"
  703. size="small"
  704. @click="addSettleUnitConfirm(scope.row)"
  705. >保存</el-button
  706. >
  707. <el-button type="info" size="small" @click="initSettleTableData"
  708. >取消</el-button
  709. >
  710. </div>
  711. <!-- 待编辑 -->
  712. <div class="btn-wrap" v-show="!scope.row.isEdit && scope.row.id">
  713. <el-button
  714. type="primary"
  715. size="small"
  716. @click="scope.row.isEdit = true"
  717. >编辑</el-button
  718. >
  719. <el-button
  720. type="danger"
  721. size="small"
  722. @click="deleteUnit(scope.row)"
  723. >删除</el-button
  724. >
  725. </div>
  726. <!-- 待新增 -->
  727. <div class="btn-wrap" v-show="!scope.row.id">
  728. <el-button
  729. type="primary"
  730. size="small"
  731. @click="addSettleUnitConfirm(scope.row)"
  732. >新增</el-button
  733. >
  734. <el-button
  735. type="danger"
  736. size="small"
  737. @click="cancelAdd(scope.$index)"
  738. >取消</el-button
  739. >
  740. </div>
  741. </template>
  742. </el-table-column>
  743. </el-table>
  744. <div slot="footer" class="dialog-footer">
  745. <el-button @click="innerCancel">关 闭</el-button>
  746. </div>
  747. </el-dialog>
  748. <div slot="footer" class="dialog-footer">
  749. <el-button type="primary" @click="submitBillingForm">确 定</el-button>
  750. <el-button @click="billingCancel">取 消</el-button>
  751. </div>
  752. </el-dialog>
  753. </div>
  754. </template>
  755. <script>
  756. import {
  757. listSaleAccountsReceivableDetail,
  758. getSaleAccountsReceivableDetail,
  759. delSaleAccountsReceivableDetail,
  760. addSaleAccountsReceivableDetail,
  761. updateSaleAccountsReceivableDetail,
  762. addBilling,
  763. cancelBilling,
  764. } from "@/api/system/SaleAccountsReceivableDetail";
  765. import {
  766. getCustomList,
  767. customerSettlementUnit,
  768. addSettlementUnit, //新增结算单位
  769. updateSettlementUnit,
  770. deleteSettlementUnit,
  771. } from "@/api/system/SaleRegistrationCollection";
  772. import moment from "moment";
  773. export default {
  774. name: "saleAccountsReceivableDetail",
  775. dicts: [
  776. "accounting_type",
  777. "accounts_receivable_billing_type",
  778. "collection_registration_payment_method",
  779. "finished_product_invoice_type",
  780. ],
  781. data() {
  782. return {
  783. receiptIds: [], //回单ids
  784. receiptShow: false, //回单弹窗
  785. timeRange: [], //日期范围
  786. customSelectData: [], //客户list
  787. returnReceiptForm: {
  788. receiptNo: "", //回单号
  789. customId: "", //客户id
  790. isReceive: true, //收到回单
  791. receiveDate: "", //回单日期
  792. receiveRemark: "", //回单备注
  793. }, //回单
  794. receiptFormrules: {},
  795. // 遮罩层
  796. loading: true,
  797. // 选中数组
  798. ids: [],
  799. // 非单个禁用
  800. single: true,
  801. // 非多个禁用
  802. multiple: true,
  803. // 显示搜索条件
  804. showSearch: true,
  805. // 总条数
  806. total: 0,
  807. // 应收账明细表格数据
  808. SaleAccountsReceivableDetailList: [],
  809. // 弹出层标题
  810. title: "",
  811. // 是否显示弹出层
  812. open: false,
  813. // 查询参数
  814. queryParams: {
  815. pageNum: 1,
  816. pageSize: 10,
  817. accountingType: null,
  818. customerId: null,
  819. accountsReceivableDate: null,
  820. saleNo: null,
  821. saleProductNo: null,
  822. productId: null,
  823. productName: null,
  824. productSpecifications: null,
  825. productLevel: null,
  826. productColour: null,
  827. lotNumber: null,
  828. boxNum: null,
  829. weight: null,
  830. productPrice: null,
  831. amountReceivable: null,
  832. receivedAmount: null,
  833. amounts: null,
  834. paymentMethod: null,
  835. billingType: "",
  836. accountsReceivableRemark: null,
  837. settlementUnit: null,
  838. returnReceipt: "",
  839. returnReceiptDate: null,
  840. returnReceiptRemark: null,
  841. noticeNumber: null,
  842. status: 2,
  843. spare1: null,
  844. spare2: null,
  845. spare3: null,
  846. startTime: null,
  847. endTime: null,
  848. },
  849. // 表单参数
  850. form: {},
  851. // 表单校验
  852. rules: {},
  853. // 开票表单
  854. innerVisible: false,
  855. settleTableData: [],
  856. customName: "",
  857. settlementUnitList: [],
  858. currentRow: {},
  859. billingVisible: false,
  860. billingForm: {},
  861. billingFormRules: {
  862. customerId: [
  863. { required: true, message: "客户不能为空", trigger: "change" },
  864. ],
  865. invoiceNumber: [
  866. { required: true, message: "发票号码不能为空", trigger: "blur" },
  867. ],
  868. invoiceDate: [
  869. { required: true, message: "发票日期不能为空", trigger: "change" },
  870. ],
  871. invoiceType: [
  872. { required: true, message: "发票类型不能为空", trigger: "change" },
  873. ],
  874. billingAmount: [
  875. { required: true, message: "开票金额不能为空", trigger: "blur" },
  876. ],
  877. personInCharge: [
  878. { required: true, message: "负责人不能为空", trigger: "blur" },
  879. ],
  880. settlementUnitId: [
  881. { required: true, message: "结算单位不能为空", trigger: "change" },
  882. ],
  883. },
  884. };
  885. },
  886. created() {
  887. this.getList();
  888. },
  889. mounted() {
  890. this.initSelectData();
  891. },
  892. computed: {
  893. adding() {
  894. if (!this.settleTableData.length) return false;
  895. return this.settleTableData.some((item) => !item.id);
  896. },
  897. },
  898. methods: {
  899. // 确认开票
  900. submitBillingForm() {
  901. this.$refs["billingForm"].validate((valid) => {
  902. if (valid) {
  903. if (this.billingForm.id != null) {
  904. updateFinishedProductInvoice(this.billingForm).then((response) => {
  905. this.$modal.msgSuccess("修改成功");
  906. this.billingVisible = false;
  907. this.getList();
  908. });
  909. } else {
  910. this.billingForm.accountsReceivableDetailId = this.currentRow.id;
  911. this.billingForm.billingFlag = 1;
  912. addBilling(this.billingForm).then((response) => {
  913. this.$modal.msgSuccess("新增成功");
  914. this.billingVisible = false;
  915. this.getList();
  916. });
  917. }
  918. }
  919. });
  920. },
  921. // 取消开票
  922. billingCancel() {
  923. this.billingVisible = false;
  924. this.getList();
  925. },
  926. /* 删除单位 */
  927. async deleteUnit(row) {
  928. this.$confirm("是否确认删除该单位?", "提示", {
  929. confirmButtonText: "确定",
  930. cancelButtonText: "取消",
  931. type: "warning",
  932. })
  933. .then(async () => {
  934. try {
  935. let res = await deleteSettlementUnit(row.id);
  936. if (res.code == 200) {
  937. this.$message.success("删除成功!");
  938. this.initSettleTableData();
  939. } else {
  940. throw new Error(res.msg);
  941. }
  942. } catch (error) {
  943. this.$message.error(error);
  944. }
  945. })
  946. .catch(() => {
  947. this.$message({
  948. type: "info",
  949. message: "已取消删除",
  950. });
  951. });
  952. },
  953. /* 确认新增/修改一条结算单位 */
  954. async addSettleUnitConfirm(row) {
  955. let { customerName, customerRegion, id } = row;
  956. if (!customerName || !customerRegion) {
  957. this.$message.warning("请完善数据!");
  958. return;
  959. }
  960. let customerId = this.billingForm.customerId;
  961. let fun = id ? updateSettlementUnit : addSettlementUnit;
  962. let payload = {
  963. customerId,
  964. customerRegion,
  965. customerName,
  966. };
  967. if (id) {
  968. payload.id = id;
  969. }
  970. try {
  971. let res = await fun(payload);
  972. if (res.code == 200) {
  973. this.$message.success("操作成功!");
  974. this.initSettleTableData();
  975. } else {
  976. throw new Error(res.msg);
  977. }
  978. } catch (error) {
  979. this.$message.error(error);
  980. }
  981. },
  982. /* 内层弹窗关闭回调 */
  983. innerCancel() {
  984. this.innerVisible = false;
  985. this.getSettlementUnitList();
  986. },
  987. /* 新增一条结算单位 */
  988. addSettleUnit() {
  989. this.settleTableData.unshift({
  990. customerName: "",
  991. customerRegion: "",
  992. isEdit: true,
  993. });
  994. },
  995. /* 初始化结算单位表格数据 */
  996. async initSettleTableData() {
  997. await this.getSettlementUnitList();
  998. this.settleTableData = this.settlementUnitList.map((item) => {
  999. return {
  1000. ...item,
  1001. isEdit: false,
  1002. };
  1003. });
  1004. },
  1005. // 开始编辑结算单位
  1006. async editSettleUnit() {
  1007. let customerId = this.billingForm.customerId;
  1008. if (!customerId) {
  1009. this.$message.warning("请先选择客户名称");
  1010. return;
  1011. }
  1012. this.customName = this.customSelectData.find(
  1013. (item) => item.id == this.billingForm.customerId
  1014. )?.customName;
  1015. await this.initSettleTableData();
  1016. console.log(111);
  1017. this.innerVisible = true;
  1018. },
  1019. // 获取结算单位下拉框数据
  1020. async getSettlementUnitList() {
  1021. let customerId = this.billingForm.customerId;
  1022. if (!customerId) {
  1023. this.$message.warning("请先选择客户名称");
  1024. return;
  1025. }
  1026. try {
  1027. let payload = {
  1028. customerId,
  1029. isEnablePaging: false,
  1030. };
  1031. let res = await customerSettlementUnit(payload);
  1032. if (res.code == 200) {
  1033. this.settlementUnitList = res.rows;
  1034. } else {
  1035. throw new Error(res.msg);
  1036. }
  1037. } catch (error) {
  1038. this.$message.error(error);
  1039. }
  1040. },
  1041. // 新增开票
  1042. addBilling() {
  1043. this.resetBillingForm();
  1044. this.billingVisible = true;
  1045. },
  1046. resetBillingForm() {
  1047. this.billingForm = {
  1048. id: null,
  1049. invoiceDate: null,
  1050. customerId: null,
  1051. settlementUnitId: null,
  1052. invoiceNumber: null,
  1053. invoiceType: null,
  1054. billingAmount: null,
  1055. personInCharge: null,
  1056. remark: null,
  1057. createBy: null,
  1058. createById: null,
  1059. createTime: null,
  1060. updateBy: null,
  1061. updateById: null,
  1062. updateTime: null,
  1063. delFlag: null,
  1064. };
  1065. this.resetForm("billingForm");
  1066. },
  1067. // 开票回调
  1068. async billingFlagChange(row) {
  1069. let billingFlag = row.billingFlag;
  1070. if (billingFlag == 1) {
  1071. //开票
  1072. this.currentRow = row;
  1073. this.addBilling();
  1074. } else {
  1075. this.$confirm("是否确认取消开票?", "提示", {
  1076. confirmButtonText: "确定",
  1077. cancelButtonText: "取消",
  1078. type: "warning",
  1079. })
  1080. .then(async () => {
  1081. // 取消开票
  1082. let payload = {
  1083. id: row.finishedProductInvoiceId,
  1084. accountsReceivableDetailId: row.id,
  1085. billingFlag: 0,
  1086. };
  1087. let res = await cancelBilling(payload);
  1088. if (res.code == 200) {
  1089. this.$message({
  1090. message: "取消开票成功",
  1091. type: "success",
  1092. });
  1093. this.getList();
  1094. } else {
  1095. this.$message({
  1096. message: res.msg,
  1097. type: "error",
  1098. });
  1099. this.getList();
  1100. }
  1101. })
  1102. .catch(() => {
  1103. this.$message({
  1104. type: "info",
  1105. message: "已取消",
  1106. });
  1107. this.getList();
  1108. });
  1109. }
  1110. },
  1111. // 根据字典value获取字典label
  1112. getDictLabel(value, dict) {
  1113. return (
  1114. this.dict.type[dict].find((item) => {
  1115. return item.value === value;
  1116. })?.label || ""
  1117. );
  1118. },
  1119. // 修改回单数据
  1120. async returnReceiptChange(row) {
  1121. console.log(row.returnReceiptDate);
  1122. // return;
  1123. try {
  1124. let payLoad = {
  1125. id: row.id,
  1126. returnReceipt: row.returnReceipt,
  1127. returnReceiptDate:
  1128. row.returnReceipt == "1" ? row.returnReceiptDate || new Date() : "",
  1129. returnReceiptRemark:
  1130. row.returnReceipt == "1" ? row.returnReceiptRemark || "" : "",
  1131. };
  1132. let res = await updateSaleAccountsReceivableDetail(payLoad);
  1133. if (res.code == 200) {
  1134. this.$message.success("修改成功");
  1135. this.getList();
  1136. } else {
  1137. throw new Error(res.msg);
  1138. }
  1139. } catch (error) {
  1140. this.$message.error(error);
  1141. }
  1142. },
  1143. // 单元格点击回调
  1144. cellClick(row, column, cell, event) {
  1145. console.log(row, column, cell, event);
  1146. let columnList = ["returnReceiptDate", "returnReceiptRemark"];
  1147. if (columnList.includes(column.property)) {
  1148. row[column.property + "Show"] = true;
  1149. }
  1150. },
  1151. // 提交回单回调
  1152. submitReceiptForm() {},
  1153. // 回单回调
  1154. handlerReceipt(id) {
  1155. // let ids=[id]||this.ids;
  1156. this.receiptIds = [id] || this.ids;
  1157. this.receiptShow = true;
  1158. },
  1159. // 日期范围改变回调
  1160. timeRangeChange(val) {
  1161. this.queryParams.startTime = moment(val[0]).format("YYYY-MM-DD");
  1162. this.queryParams.endTime = moment(val[1]).format("YYYY-MM-DD");
  1163. this.handleQuery();
  1164. },
  1165. // 初始化下拉框选择数据
  1166. async initSelectData() {
  1167. // 客户数据
  1168. try {
  1169. let res1 = await getCustomList({ isEnablePaging: false });
  1170. if (res1.code == 200) {
  1171. this.customSelectData = res1.rows;
  1172. } else {
  1173. throw new Error(res1.msg);
  1174. }
  1175. } catch (error) {
  1176. this.$message.error(error);
  1177. }
  1178. },
  1179. /** 查询应收账明细列表 */
  1180. getList() {
  1181. this.loading = true;
  1182. listSaleAccountsReceivableDetail(this.queryParams).then((response) => {
  1183. this.SaleAccountsReceivableDetailList = response.rows.map((item) => {
  1184. return {
  1185. ...item,
  1186. returnReceiptDateShow: false,
  1187. returnReceiptRemarkShow: false,
  1188. };
  1189. });
  1190. this.total = response.total;
  1191. this.loading = false;
  1192. });
  1193. },
  1194. // 取消按钮
  1195. cancel() {
  1196. this.open = false;
  1197. this.reset();
  1198. },
  1199. // 表单重置
  1200. reset() {
  1201. this.form = {
  1202. id: null,
  1203. accountingType: null,
  1204. customerId: null,
  1205. accountsReceivableDate: null,
  1206. saleNo: null,
  1207. saleProductNo: null,
  1208. productId: null,
  1209. productName: null,
  1210. productSpecifications: null,
  1211. productLevel: null,
  1212. productColour: null,
  1213. lotNumber: null,
  1214. boxNum: null,
  1215. weight: null,
  1216. productPrice: null,
  1217. amountReceivable: null,
  1218. receivedAmount: null,
  1219. amounts: null,
  1220. paymentMethod: null,
  1221. billingType: null,
  1222. accountsReceivableRemark: null,
  1223. settlementUnit: null,
  1224. returnReceipt: null,
  1225. returnReceiptDate: null,
  1226. returnReceiptRemark: null,
  1227. noticeNumber: null,
  1228. status: null,
  1229. spare1: null,
  1230. spare2: null,
  1231. spare3: null,
  1232. remark: null,
  1233. createBy: null,
  1234. createById: null,
  1235. createTime: null,
  1236. updateBy: null,
  1237. updateById: null,
  1238. updateTime: null,
  1239. delFlag: null,
  1240. };
  1241. this.resetForm("form");
  1242. },
  1243. /** 搜索按钮操作 */
  1244. handleQuery() {
  1245. this.queryParams.pageNum = 1;
  1246. this.getList();
  1247. },
  1248. /** 重置按钮操作 */
  1249. resetQuery() {
  1250. this.resetForm("queryForm");
  1251. this.handleQuery();
  1252. },
  1253. // 多选框选中数据
  1254. handleSelectionChange(selection) {
  1255. this.ids = selection.map((item) => item.id);
  1256. this.single = selection.length !== 1;
  1257. this.multiple = !selection.length;
  1258. },
  1259. /** 新增按钮操作 */
  1260. handleAdd() {
  1261. this.reset();
  1262. this.open = true;
  1263. this.title = "添加应收账明细";
  1264. },
  1265. /** 修改按钮操作 */
  1266. handleUpdate(row) {
  1267. this.reset();
  1268. const id = row.id || this.ids;
  1269. getSaleAccountsReceivableDetail(id).then((response) => {
  1270. this.form = response.data;
  1271. this.open = true;
  1272. this.title = "修改应收账明细";
  1273. });
  1274. },
  1275. /** 提交按钮 */
  1276. submitForm() {
  1277. this.$refs["form"].validate((valid) => {
  1278. if (valid) {
  1279. if (this.form.id != null) {
  1280. updateSaleAccountsReceivableDetail(this.form).then((response) => {
  1281. this.$modal.msgSuccess("修改成功");
  1282. this.open = false;
  1283. this.getList();
  1284. });
  1285. } else {
  1286. addSaleAccountsReceivableDetail(this.form).then((response) => {
  1287. this.$modal.msgSuccess("新增成功");
  1288. this.open = false;
  1289. this.getList();
  1290. });
  1291. }
  1292. }
  1293. });
  1294. },
  1295. /** 删除按钮操作 */
  1296. handleDelete(row) {
  1297. const ids = row.id || this.ids;
  1298. this.$modal
  1299. .confirm('是否确认删除应收账明细编号为"' + ids + '"的数据项?')
  1300. .then(function () {
  1301. return delSaleAccountsReceivableDetail(ids);
  1302. })
  1303. .then(() => {
  1304. this.getList();
  1305. this.$modal.msgSuccess("删除成功");
  1306. })
  1307. .catch(() => {});
  1308. },
  1309. /** 导出按钮操作 */
  1310. handleExport() {
  1311. this.download(
  1312. "system/SaleAccountsReceivableDetail/export",
  1313. {
  1314. ...this.queryParams,
  1315. },
  1316. `SaleAccountsReceivableDetail_${new Date().getTime()}.xlsx`
  1317. );
  1318. },
  1319. },
  1320. };
  1321. </script>