saleAccountsReceivableDetail.vue 52 KB

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