third-print-settlement.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. <template>
  2. <div class="mod-transport">
  3. <!-- 搜索栏 -->
  4. <div class="search-bar">
  5. <el-form :inline="true" class="search-form" ref="searchForm" :model="searchForm" label-width="auto" size="small">
  6. <div class="input-row">
  7. <el-form-item label="打印渠道" class="search-form-item">
  8. <el-select
  9. v-model="searchForm.printChannel"
  10. clearable
  11. placeholder="请选择打印渠道"
  12. size="small">
  13. <el-option key="KuaiYin" label="快印" value="KuaiYin"></el-option>
  14. <el-option key="WoNiu" label="蜗牛" value="WoNiu"></el-option>
  15. <el-option key="Lightning" label="闪电" value="Lightning"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item label="推广店铺" prop="shopId">
  19. <el-select v-model="searchForm.shopId" placeholder="推广店铺"
  20. controls-position="right" :clearable="true">
  21. <el-option v-for="item in shopList" :key="item.shopId" :label="item.shopName" :value="item.shopId">
  22. </el-option>
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="结算名称" class="search-form-item">
  26. <el-input type="text" v-model="searchForm.settleName" placeholder="请输入结算名称"></el-input>
  27. </el-form-item>
  28. <el-form-item label="结算状态" class="search-form-item">
  29. <el-select
  30. v-model="searchForm.status"
  31. clearable
  32. placeholder="请选择结算状态"
  33. size="small">
  34. <el-option key="0" label="待结算" value="0"></el-option>
  35. <el-option key="1" label="已结算" value="1"></el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="结算时段" class="search-form-item">
  39. <el-date-picker
  40. :default-time="['00:00:00', '23:59:59']"
  41. v-model="dateRange"
  42. type="datetimerange"
  43. range-separator="至"
  44. start-placeholder="开始时间"
  45. end-placeholder="结束时间"
  46. value-format="yyyy-MM-dd HH:mm:ss">
  47. </el-date-picker>
  48. </el-form-item>
  49. <el-form-item>
  50. <div class="default-btn primary-btn" @click="searchChange(true)">{{$t('crud.searchBtn')}}</div>
  51. <div class="default-btn" @click="resetSearchForm('searchForm')">{{$t('shop.resetMap')}}</div>
  52. </el-form-item>
  53. </div>
  54. </el-form>
  55. </div>
  56. <div class="main-container">
  57. <!-- 操作栏 -->
  58. <div class="operation-bar">
  59. <div
  60. class="default-btn primary-btn"
  61. @click="addOrUpdateHandle()">
  62. 新增结算
  63. </div>
  64. </div>
  65. <div style="margin-top: 10px; width: 1000px;">
  66. <el-row :gutter="12">
  67. <el-col :span="4">
  68. <el-card :body-style="{padding:'10px'}"shadow="never">
  69. <div>
  70. <span style="font-size: 16px">待结算总金额</span>
  71. <div style="margin-top: 5px;">
  72. <span v-if="stat.settleAmount" style="color: green; font-weight: bold;font-size: 20px">+ ¥{{parseFloat(stat.settleAmount).toFixed(2)}}</span>
  73. <span v-else style="color: green; font-weight: bold;font-size: 20px">+ ¥0</span>
  74. </div>
  75. </div>
  76. </el-card>
  77. </el-col>
  78. <el-col :span="4">
  79. <el-card :body-style="{padding:'10px'}"shadow="never">
  80. <div>
  81. <span style="font-size: 16px">待结算材质金额</span>
  82. <div style="margin-top: 5px">
  83. <span v-if="stat.settleSkuAmount" style="color: green; font-weight: bold;font-size: 20px;">+ ¥{{parseFloat(stat.settleSkuAmount).toFixed(2)}}</span>
  84. <span v-else style="color: green; font-weight: bold;font-size: 20px;">+ ¥0</span>
  85. </div>
  86. </div>
  87. </el-card>
  88. </el-col>
  89. <el-col :span="4">
  90. <el-card :body-style="{padding:'10px'}"shadow="never">
  91. <div>
  92. <span style="font-size: 16px">待结算物料金额</span>
  93. <div style="margin-top: 5px">
  94. <span v-if="stat.settleMaterialAmount" style="color: green; font-weight: bold;font-size: 20px;">+ ¥{{parseFloat(stat.settleMaterialAmount).toFixed(2)}}</span>
  95. <span v-else style="color: green; font-weight: bold;font-size: 20px;">+ ¥0</span>
  96. </div>
  97. </div>
  98. </el-card>
  99. </el-col>
  100. <el-col :span="4">
  101. <el-card :body-style="{padding:'10px'}"shadow="never">
  102. <div>
  103. <span style="font-size: 16px">待结算快递打包额</span>
  104. <div style="margin-top: 5px">
  105. <span v-if="stat.settleLaborAmount" style="color: green; font-weight: bold;font-size: 20px;">+ ¥{{parseFloat(stat.settleLaborAmount).toFixed(2)}}</span>
  106. <span v-else style="color: green; font-weight: bold;font-size: 20px;">+ ¥0</span>
  107. </div>
  108. </div>
  109. </el-card>
  110. </el-col>
  111. <el-col :span="4">
  112. <el-card :body-style="{padding:'10px'}"shadow="never">
  113. <div>
  114. <span style="font-size: 16px">售后结算金额</span>
  115. <div style="margin-top: 5px">
  116. <span v-if="stat.settleAfterSalesCostAmount" style="color: red; font-weight: bold;font-size: 20px">- ¥{{parseFloat(stat.settleAfterSalesCostAmount).toFixed(2)}}</span>
  117. <span v-else style="color: red; font-weight: bold;font-size: 20px">- ¥0</span>
  118. </div>
  119. </div>
  120. </el-card>
  121. </el-col>
  122. </el-row>
  123. </div>
  124. <!-- 表格 -->
  125. <div class="table-con transport-table">
  126. <el-table
  127. ref="waveTable"
  128. :data="dataList"
  129. border
  130. header-cell-class-name="table-header"
  131. row-class-name="table-row-low"
  132. style="width: 100%">
  133. <el-table-column
  134. v-if="shopId == 1"
  135. align="center"
  136. prop="settleName"
  137. label="打印渠道">
  138. <template slot-scope="scope">
  139. <span class="table-cell-text">{{ scope.row.printChannel }}</span>
  140. </template>
  141. </el-table-column>
  142. <el-table-column
  143. width="160px"
  144. align="center"
  145. prop="settleName"
  146. label="结算名称">
  147. <template slot-scope="scope">
  148. <span class="table-cell-text">{{ scope.row.settleName }}</span>
  149. </template>
  150. </el-table-column>
  151. <el-table-column
  152. width="160px"
  153. label="结算时段"
  154. align="center"
  155. prop="startTime">
  156. <template slot-scope="scope">
  157. <span>{{scope.row.startTime }}</span>
  158. <br/>
  159. <span>{{scope.row.endTime }}</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column
  163. label="结算总金额"
  164. align="center"
  165. prop="settleAmount">
  166. <template slot-scope="scope">
  167. <span style="color: green; font-weight: bold;font-size: 16px">{{scope.row.settleAmount }}</span>
  168. </template>
  169. </el-table-column>
  170. <el-table-column
  171. align="center"
  172. prop="settleSkuAmount"
  173. label="材料结算金额">
  174. <template slot-scope="scope">
  175. <span style="color: green; font-weight: bold;font-size: 16px">+{{scope.row.settleSkuAmount }}</span>
  176. </template>
  177. </el-table-column>
  178. <el-table-column
  179. align="center"
  180. label="物料结算金额"
  181. prop="settleMaterialAmount">
  182. <template slot-scope="scope">
  183. <span style="color: green; font-weight: bold;font-size: 16px">+{{scope.row.settleMaterialAmount }}</span>
  184. </template>
  185. </el-table-column>
  186. <el-table-column
  187. align="center"
  188. width="110px"
  189. label="打包快递结算金额(按件2.55元)"
  190. prop="settleLaborAmount">
  191. <template slot-scope="scope">
  192. <span style="color: green; font-weight: bold;font-size: 16px">+{{scope.row.settleLaborAmount }}</span>
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. width="110px"
  197. align="center"
  198. label="售后结算金额(按成本)"
  199. prop="settleAfterSalesAmount">
  200. <template slot-scope="scope">
  201. <span style="color: red; font-weight: bold;font-size: 16px">-{{scope.row.settleAfterSalesCostAmount }}</span>
  202. </template>
  203. </el-table-column>
  204. <!--<el-table-column
  205. align="center"
  206. label="售后结算金额"
  207. prop="settleAfterSalesAmount">
  208. <template slot-scope="scope">
  209. <span style="color: red; font-weight: bold;font-size: 16px">-{{scope.row.settleAfterSalesAmount }}</span>
  210. </template>
  211. </el-table-column>-->
  212. <el-table-column
  213. align="center"
  214. prop="settleOrderNums"
  215. label="订单数">
  216. <template slot-scope="scope">
  217. <span>{{scope.row.settleOrderNums }}</span>
  218. </template>
  219. </el-table-column>
  220. <el-table-column
  221. align="center"
  222. prop="settleOrderDeliveryNums"
  223. label="已发货数">
  224. <template slot-scope="scope">
  225. <span>{{scope.row.settleOrderDeliveryNums }}</span>
  226. </template>
  227. </el-table-column>
  228. <el-table-column
  229. align="center"
  230. prop="settleOrderDeliveryNums"
  231. label="单独运单号数">
  232. <template slot-scope="scope">
  233. <span>{{scope.row.diffDvyNums }}</span>
  234. </template>
  235. </el-table-column>
  236. <el-table-column
  237. align="center"
  238. prop="settleOrderDeliveryNums"
  239. label="集货发货数">
  240. <template slot-scope="scope">
  241. <span>{{scope.row.mergeDvyNums }}</span>
  242. </template>
  243. </el-table-column>
  244. <el-table-column
  245. align="center"
  246. prop="settleOrderDeliveryNums"
  247. label="相同运单号数">
  248. <template slot-scope="scope">
  249. <span>{{scope.row.sameDvyNums }}</span>
  250. </template>
  251. </el-table-column>
  252. <el-table-column
  253. align="center"
  254. prop="settleOrderSheets"
  255. label="材料总张数">
  256. <template slot-scope="scope">
  257. <span>{{scope.row.settleOrderSheets }}</span>
  258. </template>
  259. </el-table-column>
  260. <el-table-column
  261. align="center"
  262. prop="status"
  263. label="结算状态">
  264. <template slot-scope="scope">
  265. <el-tag v-if="scope.row.status === 0" type="danger" effect="dark">待结算</el-tag>
  266. <el-tag v-if="scope.row.status ===1" type="success" effect="dark">已结算</el-tag>
  267. </template>
  268. </el-table-column>
  269. <el-table-column
  270. align="center"
  271. prop="remark"
  272. label="备注">
  273. <template slot-scope="scope">
  274. <span>{{scope.row.remark }}</span>
  275. </template>
  276. </el-table-column>
  277. <el-table-column
  278. align="center"
  279. :label="$t('crud.menu')"
  280. width="160">
  281. <template slot-scope="scope">
  282. <div style="display: inline-block;float: left;">
  283. </div>
  284. <div
  285. class="default-btn text-btn"
  286. @click="viewSettlementDetail(scope.row)">小计</div>
  287. <div
  288. class="default-btn text-btn"
  289. @click="addOrUpdateHandle(scope.row.thirdSettleId)">
  290. 编辑
  291. </div>
  292. <div
  293. class="default-btn text-btn"
  294. @click="syncSettlement(scope.row)">更新</div>
  295. <br/>
  296. <!-- <div
  297. style="margin: 0 0"
  298. class="default-btn text-btn"
  299. @click="openModifySettleDeliveryDialog(scope.row.thirdSettleId)">
  300. 修改运费
  301. </div>-->
  302. <!-- <br/>-->
  303. <div
  304. style="margin: 0 0"
  305. class="default-btn text-btn"
  306. :loading="downloadLoading"
  307. @click="downloadSettlementSku(scope.row)">
  308. 下载明细单
  309. </div>
  310. <br/>
  311. <div
  312. style="margin: 0 0"
  313. class="default-btn text-btn"
  314. :loading="downloadLoading"
  315. @click="downloadAfterSales(scope.row)">
  316. 下载售后单
  317. </div>
  318. </template>
  319. </el-table-column>
  320. </el-table>
  321. </div>
  322. <!-- 分页 -->
  323. <el-pagination
  324. v-if="dataList.length"
  325. @size-change="handleSizeChange"
  326. @current-change="handleCurrentChange"
  327. :current-page="page.currentPage"
  328. :page-sizes="[10, 20, 50, 100]"
  329. :page-size="page.pageSize"
  330. layout="total, sizes, prev, pager, next, jumper"
  331. :total="page.total">
  332. </el-pagination>
  333. </div>
  334. <!-- 修改波次 -->
  335. <el-dialog
  336. title="修改快递运费结算"
  337. :visible.sync="settleDeliveryVisible"
  338. v-if="settleDeliveryVisible"
  339. width="40%"
  340. center
  341. :close-on-click-modal="false"
  342. :close-on-press-escape="false">
  343. <el-form :model="settlement" label-position="left">
  344. <el-form-item label="结算账单" label-width="100px">
  345. <span autocomplete="off">{{settlement.settleName}}</span>
  346. </el-form-item>
  347. <el-form-item label="当前快递结算" label-width="100px">
  348. <span autocomplete="off">{{settlement.settleDeliveryAmount}}</span>
  349. </el-form-item>
  350. <el-form-item label="最新快递结算" label-width="100px">
  351. <el-input v-model="settlement.modifySettleDeliveryAmount" autocomplete="off"></el-input>
  352. </el-form-item>
  353. </el-form>
  354. <div slot="footer" class="dialog-footer">
  355. <el-button type="primary" @click="updateSettleDeliveryAmount(settlement)">确 认</el-button>
  356. </div>
  357. </el-dialog>
  358. <PrintSettlementAddOrUpdate v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="refreshChange"></PrintSettlementAddOrUpdate>
  359. <PrintSettlementDetail v-if="settlementDetailVisible" ref="settlementDetail"></PrintSettlementDetail>
  360. </div>
  361. </template>
  362. <script>
  363. import {downloadXls} from "@/utils/excel";
  364. import {downloadZip} from "@/utils/zip";
  365. import PrintSettlementAddOrUpdate from './print-settlement-add-or-update';
  366. import PrintSettlementDetail from './third-print-settlement-detail';
  367. export default {
  368. components: {PrintSettlementAddOrUpdate, PrintSettlementDetail},
  369. data () {
  370. return {
  371. theData: null, // 保存上次点击查询的请求条件
  372. addOrUpdateVisible: false,
  373. settlementDetailVisible: false,
  374. settleDeliveryVisible: false,
  375. downloadLoading: false,
  376. stat:{},
  377. dataForm: {
  378. transName: ''
  379. },
  380. shopList: [],
  381. dataList: [],
  382. dataListLoading: false,
  383. page: {
  384. total: 0, // 总页数
  385. currentPage: 1, // 当前页数
  386. pageSize: 10 // 每页显示多少条
  387. },
  388. searchForm: {printChannel: 'Lightning'},
  389. dateRange: [],
  390. selectAll: false,
  391. settlement: {
  392. settleDeliveryAmount: 0,
  393. modifySettleDeliveryAmount:null
  394. }
  395. }
  396. },
  397. created () {
  398. this.getDataList();
  399. this.getStat();
  400. this.getShopList()
  401. },
  402. computed: {
  403. shopId: {
  404. get () { return this.$store.state.user.shopId }
  405. },
  406. },
  407. methods: {
  408. getShopList() {
  409. this.$http({
  410. url: this.$http.adornUrl('/platform/shopDetail/getShopList'),
  411. method: 'get',
  412. params: this.$http.adornParams({shopId: this.shopId})
  413. }).then(({ data }) => {
  414. if (data) {
  415. this.shopList = data
  416. }
  417. })
  418. },
  419. getStat(){
  420. this.$http({
  421. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/stat'),
  422. method: 'GET',
  423. params: this.$http.adornParams(this.searchForm)
  424. }).then(({data}) => {
  425. this.stat = data;
  426. }).catch((error) => {
  427. })
  428. },
  429. // 新增 / 修改
  430. addOrUpdateHandle (id) {
  431. this.addOrUpdateVisible = true
  432. this.$nextTick(() => {
  433. this.$refs.addOrUpdate.init(id)
  434. })
  435. },
  436. viewSettlementDetail(settlement){
  437. this.settlementDetailVisible = true;
  438. this.$nextTick(() => {
  439. this.$refs.settlementDetail.init(settlement)
  440. })
  441. },
  442. openModifySettleDeliveryDialog(thirdSettleId){
  443. this.getSettlement(thirdSettleId);
  444. this.settleDeliveryVisible = true;
  445. },
  446. refreshChange () {
  447. this.getDataList(this.page);
  448. },
  449. // 获取数据列表
  450. getDataList (page, newData = false) {
  451. this.dataListLoading = true
  452. if (newData || !this.theData) {
  453. this.searchForm.startTime = this.dateRange === null ? null : this.dateRange[0], // 开始时间
  454. this.searchForm.endTime = this.dateRange === null ? null : this.dateRange[1], // 结束时间
  455. this.theData = JSON.parse(JSON.stringify(this.searchForm))
  456. }
  457. this.$http({
  458. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/page'),
  459. method: 'get',
  460. params: this.$http.adornParams(
  461. Object.assign(
  462. {
  463. current: page == null ? this.page.currentPage : page.currentPage,
  464. size: page == null ? this.page.pageSize : page.pageSize
  465. },
  466. this.theData
  467. )
  468. )
  469. }).then(({data}) => {
  470. this.dataList = data.records
  471. this.page.total = data.total
  472. this.dataListLoading = false
  473. })
  474. },
  475. // 获取详情
  476. getSettlement(thirdSettleId){
  477. this.$http({
  478. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/info/' + thirdSettleId),
  479. method: 'GET',
  480. params: this.$http.adornParams(),
  481. }).then(({data}) => {
  482. if(data){
  483. this.settlement = data;
  484. }
  485. }).catch((error) => {
  486. })
  487. },
  488. updateSettleDeliveryAmount(){
  489. this.$http({
  490. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/updateDeliveryAmount'),
  491. method: 'POST',
  492. data: this.$http.adornData(this.settlement),
  493. }).then(({data}) => {
  494. this.settleDeliveryVisible = false;
  495. this.getDataList(this.page, false);
  496. }).catch((error) => {
  497. })
  498. },
  499. downloadSettlementSku(settlement){
  500. this.downloadLoading = true;
  501. this.$http({
  502. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/downloadSettlementSku'),
  503. method: 'GET',
  504. params: this.$http.adornParams(settlement),
  505. responseType: 'blob'
  506. }).then(({data}) => {
  507. let fileName = settlement.settleName + "_结算账单明细表";
  508. downloadXls(data, fileName + ".xlsx");
  509. this.downloadLoading = false;
  510. }).catch((error) => {
  511. })
  512. },
  513. downloadAfterSales(settlement){
  514. this.downloadLoading = true;
  515. this.$http({
  516. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/downloadAfterSales'),
  517. method: 'GET',
  518. params: this.$http.adornParams(settlement),
  519. responseType: 'blob'
  520. }).then(({data}) => {
  521. let fileName = settlement.settleName + "_售后明细表";
  522. downloadXls(data, fileName + ".xlsx");
  523. this.downloadLoading = false;
  524. }).catch((error) => {
  525. })
  526. },
  527. syncSettlement(settlement){
  528. this.$http({
  529. url: this.$http.adornUrl('/printSettlement/thirdPrintSettlement/syncSettlement'),
  530. method: 'POST',
  531. data: this.$http.adornData(settlement),
  532. }).then(({data})=> {
  533. if(data){
  534. this.getDataList(this.page, false);
  535. this.$message({
  536. message: "更新成功",
  537. type: 'success'
  538. })
  539. }else{
  540. this.$message({
  541. message: "暂无更新",
  542. type: 'warning'
  543. })
  544. }
  545. }).catch((error) => {
  546. })
  547. },
  548. // 条件查询
  549. searchChange (newData = false) {
  550. this.stat = {}
  551. this.getDataList(this.page, newData);
  552. this.getStat();
  553. },
  554. /**
  555. * 重置表单
  556. * @param {String} formName 表单名称
  557. */
  558. resetSearchForm (formName) {
  559. this.$refs[formName].resetFields()
  560. this.searchForm = {};
  561. this.stat = {settleAmount:0, settleSkuAmount:0, settleAfterCostAmount:0, settleLaborAmount:0}
  562. },
  563. handleSizeChange (val) {
  564. this.page.pageSize = val
  565. this.getDataList()
  566. },
  567. handleCurrentChange (val) {
  568. this.page.currentPage = val
  569. this.getDataList(this.page, false)
  570. }
  571. }
  572. }
  573. </script>
  574. <style lang="scss" scoped>
  575. </style>