examine.vue 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219
  1. <template>
  2. <div>
  3. <Card :bordered="false" dis-hover class="mt15">
  4. <Form ref="orderData" :model="orderData" :label-width="labelWidth" :label-position="labelPosition"
  5. class="tabform" @submit.native.prevent>
  6. <div class="acea-row">
  7. <FormItem label="时间选择:">
  8. <DatePicker :editable="false" :clearable="true" @on-change="onchangeTime" :value="timeVal"
  9. format="yyyy/MM/dd HH:mm:ss" type="datetimerange" placement="bottom-start"
  10. placeholder="自定义时间" style="width: 250px" class="mr30" :options="options"></DatePicker>
  11. </FormItem>
  12. <!-- <FormItem label="订单类型:">
  13. <Select v-model="orderData.type" style="width: 250px" class="mr30" clearable
  14. @on-change="userSearchs" placeholder="全部订单">
  15. <Option value="">全部订单</Option>
  16. <Option value="0">普通订单</Option>
  17. <Option value="1">秒杀订单</Option>
  18. <Option value="2">砍价订单</Option>
  19. <Option value="3">拼团订单</Option>
  20. <Option value="4">套餐订单</Option>
  21. <Option value="9">新人订单</Option>
  22. </Select>
  23. </FormItem> -->
  24. <FormItem label="订单审核:">
  25. <Select v-model="orderData.pay_status" style="width: 250px" class="mr30" clearable
  26. @on-change="userSearchs" placeholder="全部订单">
  27. <Option value="-1">全部订单</Option>
  28. <Option value="0">待审核</Option>
  29. <Option value="1">已通过</Option>
  30. <Option value="2">已拒绝</Option>
  31. </Select>
  32. </FormItem>
  33. <FormItem label="凭证:">
  34. <Select v-model="orderData.pay_img_status" style="width: 250px" class="mr30" clearable
  35. @on-change="userSearchs" placeholder="全部订单">
  36. <Option :value="0">没有凭证</Option>
  37. <Option :value="1">有凭证</Option>
  38. </Select>
  39. </FormItem>
  40. <FormItem label="订单类型:">
  41. <Select v-model="orderData.is_level_order" style="width: 250px" class="mr30" clearable
  42. @on-change="userSearchs" placeholder="全部订单">
  43. <Option :value="-1">全部</Option>
  44. <Option :value="1">升级订单</Option>
  45. <Option :value="2">普通订单</Option>
  46. </Select>
  47. </FormItem>
  48. <FormItem label="订单状态:">
  49. <Select v-model="orderData.status" style="width: 250px" class="mr30" clearable
  50. @on-change="userSearchs" placeholder="全部">
  51. <Option value="">全部</Option>
  52. <Option value="0">待确认</Option>
  53. <Option value="1">未发货</Option>
  54. <Option value="2">待收货</Option>
  55. <Option value="3">待评价</Option>
  56. <Option value="4">交易完成</Option>
  57. <Option value="-4">已删除</Option>
  58. </Select>
  59. </FormItem>
  60. <FormItem label="支付方式:">
  61. <Select v-model="orderData.pay_type" clearable class="mr30" style="width: 250px"
  62. @on-change="userSearchs" placeholder="全部">
  63. <Option v-for="item in payList" :value="item.val" :key="item.id">{{
  64. item.label
  65. }}</Option>
  66. </Select>
  67. </FormItem>
  68. <FormItem label="订单搜索:">
  69. <Input v-model="orderData.real_name" placeholder="请输入" element-id="name" clearable
  70. style="width:250px;" maxlength="20">
  71. <Select v-model="orderData.field_key" slot="prepend" style="width:80px;" default-label="全部">
  72. <Option value="all">全部</Option>
  73. <Option value="order_id">订单号</Option>
  74. <Option value="uid">用户UID</Option>
  75. <Option value="real_name">用户姓名</Option>
  76. <Option value="user_phone">用户电话</Option>
  77. <Option value="title">商品名称</Option>
  78. <Option value="total_num">商品件数</Option>
  79. </Select>
  80. </Input>
  81. </FormItem>
  82. <Button type="primary" @click="userSearchs" class="ml20">查询</Button>
  83. <Button @click="reset" class="ml20">重置</Button>
  84. </div>
  85. </Form>
  86. </Card>
  87. <Card :bordered="false" dis-hover class="mt15">
  88. <div class="acea-row row-between">
  89. <div>
  90. <Tooltip content="本页至少选中一项" :disabled="!!checkUidList.length && isAll==0">
  91. <Button class="mr10" type="primary" :disabled="!checkUidList.length && isAll==0"
  92. @click="allOrderChecked">批量审核</Button>
  93. </Tooltip>
  94. </div>
  95. </div>
  96. <vxe-table border="inner" ref="xTable" class="mt25" :loading="loading" row-id="id"
  97. :expand-config="{accordion: true}" :checkbox-config="{reserve: true}" @checkbox-all="checkboxAll"
  98. @checkbox-change="checkboxItem" :data="orderList">
  99. <vxe-column type="" width="0"></vxe-column>
  100. <vxe-column type="expand" width="35">
  101. <template #content="{ row }">
  102. <div class="tdinfo">
  103. <Row class="expand-row">
  104. <Col span="8">
  105. <span class="expand-key">商品总价:</span>
  106. <span class="expand-value" v-text="row.total_price"></span>
  107. </Col>
  108. <Col span="8">
  109. <span class="expand-key">下单时间:</span>
  110. <span class="expand-value" v-text="row.add_time"></span>
  111. </Col>
  112. <Col span="8">
  113. <span class="expand-key">推广人:</span>
  114. <span class="expand-value" v-text="row.spread_nickname?row.spread_nickname:'无'"></span>
  115. </Col>
  116. </Row>
  117. <Row class="expand-row">
  118. <Col span="8">
  119. <span class="expand-key">用户备注:</span>
  120. <span class="expand-value" v-text="row.mark?row.mark:'无'"></span>
  121. </Col>
  122. <Col span="8">
  123. <span class="expand-key">商家备注:</span>
  124. <span class="expand-value" v-text="row.remark?row.remark:'无'"></span>
  125. </Col>
  126. </Row>
  127. </div>
  128. </template>
  129. </vxe-column>
  130. <vxe-column type="checkbox" width="100">
  131. <template #header>
  132. <div>
  133. <Dropdown transfer @on-click="allPages">
  134. <a href="javascript:void(0)" class="acea-row row-middle">
  135. <span>全选({{isAll==1?(total-checkUidList.length):checkUidList.length}})</span>
  136. <Icon type="ios-arrow-down"></Icon>
  137. </a>
  138. <template #list>
  139. <DropdownMenu>
  140. <DropdownItem name="0">当前页</DropdownItem>
  141. <DropdownItem name="1">所有页</DropdownItem>
  142. </DropdownMenu>
  143. </template>
  144. </Dropdown>
  145. </div>
  146. </template>
  147. </vxe-column>
  148. <vxe-column field="order_id" title="订单号" min-width="190">
  149. <template v-slot="{ row }">
  150. <Tooltip theme="dark" max-width="300" :delay="600" content="用户已删除"
  151. v-if="row.is_del === 1 && row.delete_time == null">
  152. <span style="color: #ed4014; display: block">{{row.order_id}}</span>
  153. </Tooltip>
  154. <span @click="changeMenu(row,'2')" v-else
  155. style="color: #2D8cF0; display: block;cursor: pointer;">{{row.order_id}}</span>
  156. </template>
  157. </vxe-column>
  158. <vxe-column field="info" title="商品信息" min-width="330">
  159. <template v-slot="{ row }">
  160. <Tooltip :transfer="true" theme="dark" max-width="300" :delay="600">
  161. <div class="tabBox" v-for="(val, i) in row._info" :key="i">
  162. <div class="tabBox_img" v-viewer>
  163. <img v-lazy="
  164. val.cart_info.productInfo.attrInfo
  165. ? val.cart_info.productInfo.attrInfo.image
  166. : val.cart_info.productInfo.image
  167. " />
  168. </div>
  169. <span class="tabBox_tit line1">
  170. <span class="font-color-red" v-if="val.cart_info.is_gift">赠品</span>
  171. {{ val.cart_info.productInfo.store_name + " | "}}
  172. {{val.cart_info.productInfo.attrInfo ? val.cart_info.productInfo.attrInfo.suk: ""}}
  173. </span>
  174. </div>
  175. <div slot="content">
  176. <div v-for="(val, i) in row._info" :key="i">
  177. <p class="font-color-red" v-if="val.cart_info.is_gift">赠品</p>
  178. <p>{{ val.cart_info.productInfo.store_name }}</p>
  179. <p> {{val.cart_info.productInfo.attrInfo ? val.cart_info.productInfo.attrInfo.suk: ""}}
  180. </p>
  181. <p class="tabBox_pice">
  182. {{ "¥" + val.cart_info.sum_price + " x " + val.cart_info.cart_num }}</p>
  183. </div>
  184. </div>
  185. </Tooltip>
  186. </template>
  187. </vxe-column>
  188. <vxe-column field="info" title="支付凭证" min-width="100">
  189. <template v-slot="{ row }">
  190. <div class="tabBox" v-if="row.pay_img.length>0">
  191. <div class="tabBox_img" v-for="it in row.pay_img" v-viewer><img v-lazy="it" /></div>
  192. </div>
  193. </template>
  194. </vxe-column>
  195. <vxe-column field="nickname" title="用户信息" min-width="130">
  196. <template v-slot="{ row }">
  197. <a @click="showUserInfo(row)">{{ row.nickname }}</a>
  198. <span style="color: #ed4014;" v-if="row.delete_time != null"> (已注销)</span>
  199. </template>
  200. </vxe-column>
  201. <!-- <vxe-column field="pink_name" title="订单类型" min-width="110"></vxe-column> -->
  202. <vxe-column field="is_level_order" title="订单类型" min-width="100">
  203. <template v-slot="{ row }">
  204. <Tag color="default" size="medium" v-show="row.is_level_order == 2">普通订单</Tag>
  205. <Tag color="green" size="medium" v-show="row.is_level_order == 1">升级订单</Tag>
  206. <Tag color="default" size="medium" v-show="row.is_level_order == 0">普通订单</Tag>
  207. </template>
  208. </vxe-column>
  209. <vxe-column field="pay_price" title="实际支付" min-width="90">
  210. <template v-slot="{ row }">
  211. <div>{{row.paid>0?row.pay_price:0}}</div>
  212. </template>
  213. </vxe-column>
  214. <vxe-column field="statusName" title="订单状态" min-width="100">
  215. <template v-slot="{ row }">
  216. <Tag color="default" size="medium" v-show="row.status == 3">{{row.status_name.status_name}}
  217. </Tag>
  218. <Tag color="orange" size="medium" v-show="row.status == 1 || row.status == 2"
  219. v-html="row.status_name.status_name"></Tag>
  220. <Tag color="red" size="medium" v-show="row.status == 0" v-html="row.status_name.status_name">
  221. </Tag>
  222. <Tag color="red" size="medium" v-show="row.status == 4">{{row.status_name.status_name}}</Tag>
  223. <Tag color="red" size="medium" v-show="row.status == 5">{{row.status_name.status_name}}</Tag>
  224. <Tag color="orange" size="medium" v-if="!row.is_all_refund && row.refund.length">部分退款中</Tag>
  225. <Tag color="orange" size="medium"
  226. v-if="row.is_all_refund && row.refund.length && row.refund_type != 6">退款中</Tag>
  227. </template>
  228. </vxe-column>
  229. <vxe-column field="pay_type" title="支付状态" min-width="90">
  230. <template v-slot="{ row }">
  231. <div>{{row.paid==1?'已支付':'未支付'}}</div>
  232. </template>
  233. </vxe-column>
  234. <vxe-column field="pay_status" title="审核状态" min-width="90">
  235. <template v-slot="{ row }">
  236. <Tag color="orange" size="medium" v-show="row.pay_status==0" v-html="'待审核'"></Tag>
  237. <Tag color="green" size="medium" v-show="row.pay_status==1" v-html="'已通过'"></Tag>
  238. <Tag color="red" size="medium" v-show="row.pay_status==2" v-html="'未通过'"></Tag>
  239. </template>
  240. </vxe-column>
  241. <vxe-column field="pay_type_name" title="支付方式" min-width="110"></vxe-column>
  242. <vxe-column field="_pay_time" title="支付时间" min-width="130"></vxe-column>
  243. <vxe-column field="action" title="操作" align="center" width="130" fixed="right">
  244. <template v-slot="{ row }">
  245. <a @click="changeMenu(row,'2')">详情</a>
  246. <Divider type="vertical" />
  247. <a @click="checkedSend(row)">审核</a>
  248. </template>
  249. </vxe-column>
  250. </vxe-table>
  251. <div class="acea-row row-right mt15">
  252. <Page :total="total" :current="orderData.page" show-elevator show-total @on-change="pageChange"
  253. :page-size="orderData.limit" />
  254. </div>
  255. </Card>
  256. <!-- 编辑 配送信息表单数据 退款 退积分 不退款-->
  257. <edit-from ref="edits" :FromData="FromData" @submitFail="submitFail"></edit-from>
  258. <!-- 详情 -->
  259. <details-from ref="detailss" :orderDatalist="orderDatalist" :orderId="orderId" :row-active="rowActive"
  260. :formType="1"></details-from>
  261. <!-- 会员详情-->
  262. <user-details ref="userDetails" fromType="order"></user-details>
  263. <!-- 备注 -->
  264. <order-remark ref="remarks" :orderId="orderId" @submitFail="submitFail"></order-remark>
  265. <!-- 记录 -->
  266. <order-record ref="record"></order-record>
  267. <!-- 发送货 -->
  268. <order-send ref="send" :orderId="orderId" @submitFail="submitFail">
  269. </order-send>
  270. <Modal v-model="manualModal" title="手动批量发货" @on-ok="manualModalOk" @on-cancel="manualModalCancel"
  271. class-name="vertical-center-modal">
  272. <Row type="flex">
  273. <Col span="4">
  274. <div style="line-height: 32px; text-align: right">文件:</div>
  275. </Col>
  276. <Col span="20">
  277. <Upload ref="upload" :action="uploadAction" :headers="uploadHeaders" accept=".xlsx,.xls"
  278. :format="['xlsx', 'xls']" :disabled="!!fileList.length" :on-success="uploadSuccess"
  279. :on-remove="removeFile">
  280. <Button icon="ios-cloud-upload-outline">上传文件</Button>
  281. </Upload>
  282. </Col>
  283. </Row>
  284. </Modal>
  285. <!--订单核销模态框-->
  286. <Modal v-model="modals2" title="订单核销" class="paymentFooter" scrollable width="400"
  287. class-name="vertical-center-modal">
  288. <Form ref="writeOffFrom" :model="writeOffFrom" :rules="writeOffRules" :label-position="labelPosition"
  289. class="tabform" @submit.native.prevent>
  290. <FormItem prop="code" label-for="code">
  291. <Input search enter-button="验证" style="width: 100%" type="text" placeholder="请输入12位核销码"
  292. @on-search="search('writeOffFrom')" v-model.number="writeOffFrom.code" number />
  293. </FormItem>
  294. </Form>
  295. <div slot="footer">
  296. <Button type="primary" @click="ok">立即核销</Button>
  297. <Button @click="del('writeOffFrom')">取消</Button>
  298. </div>
  299. </Modal>
  300. <auto-send ref="sends" :selectArr="checkUidList" :isAll="isAll"></auto-send>
  301. <queue-list ref="queue"></queue-list>
  302. <Modal v-model="showSend" title="进货单审核" width="900">
  303. <Form :label-width="labelWidth" :label-position="labelPosition" ref="showSend" :model="sendData"
  304. class="tabform">
  305. <FormItem label="支付凭证:">
  306. <div class="alertflex" >
  307. <div class="tabBox" v-for="it in actionSendData.pay_img" v-if="actionSendData.pay_img.length>0">
  308. <div class="alert_image" v-viewer><img v-lazy="it" /></div>
  309. </div>
  310. <div v-else>
  311. 无凭证
  312. </div>
  313. </div>
  314. </FormItem>
  315. <FormItem label="备注:">
  316. <Input v-model="sendData.mark" placeholder="备注" element-id="name" clearable style="width:500px;"
  317. maxlength="20">
  318. </Input>
  319. </FormItem>
  320. </Form>
  321. <div slot="footer">
  322. <Button @click="sendOrderChecked(2)">拒绝</Button>
  323. <Button type="primary" @click="sendOrderChecked(1)">通过</Button>
  324. </div>
  325. </Modal>
  326. </div>
  327. </template>
  328. <script>
  329. import {
  330. mapState
  331. } from "vuex";
  332. import editFrom from "@/components/from/from";
  333. import orderSend from "./components/orderSend";
  334. import detailsFrom from "./components/orderDetails";
  335. import orderRecord from "./components/orderRecord";
  336. import orderRemark from "./components/orderRemark";
  337. import userDetails from "@/components/userDetails/userDetails";
  338. import autoSend from "./components/autoSend";
  339. import queueList from "./components/queueList";
  340. import timeOptions from "@/utils/timeOptions";
  341. import util from "@/libs/util";
  342. import Setting from "@/setting";
  343. import exportExcel from "@/utils/newToExcel.js";
  344. import expandRow from "./components/tableExpand.vue";
  345. import {
  346. examine_lst,
  347. getOrdeDatas,
  348. getDataInfo,
  349. getRefundFrom,
  350. refundIntegral,
  351. getnoRefund,
  352. getDistribution,
  353. writeUpdate,
  354. storeOrderApi,
  355. handBatchDelivery,
  356. putWrite,
  357. exportExpressList,
  358. examine_status_order
  359. } from "@/api/order";
  360. export default {
  361. name: "index",
  362. components: {
  363. editFrom,
  364. detailsFrom,
  365. orderRecord,
  366. orderRemark,
  367. orderSend,
  368. userDetails,
  369. autoSend,
  370. queueList
  371. },
  372. data() {
  373. const codeNum = (rule, value, callback) => {
  374. if (!value) {
  375. return callback(new Error("请填写核销码"));
  376. }
  377. // 模拟异步验证效果
  378. if (!Number.isInteger(value)) {
  379. callback(new Error("请填写12位数字"));
  380. } else {
  381. const reg = /\b\d{12}\b/;
  382. if (!reg.test(value)) {
  383. callback(new Error("请填写12位数字"));
  384. } else {
  385. callback();
  386. }
  387. }
  388. };
  389. return {
  390. showSend: false, //显示审核弹窗
  391. actionSendData: {}, //保存点击的商品
  392. sendData: {
  393. id: '',
  394. status: "",
  395. mark: '',
  396. },
  397. isAll: 0,
  398. isCheckBox: false,
  399. checkUidList: [],
  400. manualModal: false,
  401. timeVal: [],
  402. options: timeOptions,
  403. payList: [{
  404. label: "全部",
  405. val: ""
  406. },
  407. {
  408. label: "微信支付",
  409. val: "1"
  410. },
  411. {
  412. label: "支付宝支付",
  413. val: "4"
  414. },
  415. {
  416. label: "余额支付",
  417. val: "2"
  418. },
  419. {
  420. label: "线下支付",
  421. val: "3"
  422. },
  423. ],
  424. // 订单列表
  425. orderData: {
  426. page: 1,
  427. limit: 10,
  428. type: "",
  429. status: "",
  430. data: "",
  431. real_name: "",
  432. pay_type: "",
  433. field_key: "all",
  434. pay_status: "-1",
  435. pay_img_status:1,
  436. is_level_order:-1,
  437. },
  438. orderList: [],
  439. total: 0,
  440. loading: false,
  441. orderConNum: 0,
  442. orderConId: 0,
  443. orderId: 0,
  444. delfromData: {},
  445. rowActive: {},
  446. orderDatalist: null,
  447. FromData: null,
  448. file: "",
  449. uploadAction: `${Setting.apiBaseURL}/file/upload/1`,
  450. uploadHeaders: {},
  451. fileList: [],
  452. modals2: false,
  453. writeOffRules: {
  454. code: [{
  455. validator: codeNum,
  456. trigger: "blur",
  457. required: true
  458. }],
  459. },
  460. writeOffFrom: {
  461. code: "",
  462. confirm: 0,
  463. },
  464. exportListOn: 0,
  465. exportList: [{
  466. name: "1",
  467. label: "导出发货单",
  468. },
  469. {
  470. name: "0",
  471. label: "导出订单",
  472. },
  473. ],
  474. };
  475. },
  476. watch: {
  477. $route() {
  478. if (this.$route.fullPath === `${Setting.roterPre}/order/list?type=7&status=1`) {
  479. this.getPath();
  480. }
  481. }
  482. },
  483. computed: {
  484. ...mapState("store/layout", ["isMobile"]),
  485. labelWidth() {
  486. return this.isMobile ? undefined : 80;
  487. },
  488. labelPosition() {
  489. return this.isMobile ? "top" : "right";
  490. },
  491. },
  492. created() {
  493. this.getToken();
  494. if (this.$route.fullPath === `${Setting.roterPre}/order/list?type=7&status=1`) {
  495. this.getPath();
  496. } else {
  497. this.getList();
  498. }
  499. },
  500. mounted() {
  501. },
  502. methods: {
  503. allOrderChecked(){
  504. if (this.checkUidList.length === 0 && this.isAll == 0) {
  505. return this.$Message.error('请先选择删除的订单!')
  506. }
  507. let idss = {
  508. all: this.isAll,
  509. ids: this.checkUidList,
  510. }
  511. this.sendData.id=this.checkUidList.join(',');
  512. this.sendData.status =1
  513. let delfromData = {
  514. title: "审核通过订单",
  515. url: `/order/examine`,
  516. method: "post",
  517. ids: this.sendData,
  518. };
  519. this.$modalSure(delfromData).then((res) => {
  520. this.$Message.success(res.msg);
  521. this.allReset();
  522. this.getList();
  523. }).catch((res) => {
  524. this.$Message.error(res.msg);
  525. });
  526. },
  527. // 通过拒绝审核
  528. sendOrderChecked(type) {
  529. if (type == 2 && this.sendData.mark == "") {
  530. this.$Message.error("请填写拒绝原因");
  531. return
  532. }
  533. this.sendData.status = type;
  534. examine_status_order(this.sendData)
  535. .then((res) => {
  536. this.$Message.success(res.msg);
  537. this.getList();
  538. this.showSend = false;
  539. })
  540. .catch((res) => {
  541. this.$Message.error(res.msg);
  542. });
  543. },
  544. // 点击显示弹窗
  545. checkedSend(item) {
  546. this.showSend = true;
  547. this.actionSendData = item;
  548. this.sendData.id = item.id;
  549. },
  550. //跳转刷新
  551. getPath() {
  552. this.orderData.page = 1;
  553. this.orderData.status = this.$route.query.status;
  554. this.getList();
  555. },
  556. allReset() {
  557. this.isAll = 0;
  558. this.isCheckBox = false;
  559. this.$refs.xTable.setAllCheckboxRow(false);
  560. this.checkUidList = [];
  561. },
  562. allPages(e) {
  563. this.isAll = e;
  564. if (e == 0) {
  565. this.$refs.xTable.toggleAllCheckboxRow();
  566. // this.checkboxAll();
  567. } else {
  568. if (!this.isCheckBox) {
  569. this.$refs.xTable.setAllCheckboxRow(true);
  570. this.isCheckBox = true;
  571. this.isAll = 1;
  572. } else {
  573. this.$refs.xTable.setAllCheckboxRow(false);
  574. this.isCheckBox = false;
  575. this.isAll = 0;
  576. }
  577. this.checkUidList = []
  578. }
  579. },
  580. checkboxItem(e) {
  581. let id = parseInt(e.rowid);
  582. let index = this.checkUidList.indexOf(id);
  583. if (index !== -1) {
  584. this.checkUidList = this.checkUidList.filter((item) => item !== id);
  585. } else {
  586. this.checkUidList.push(id);
  587. }
  588. },
  589. checkboxAll() {
  590. // 获取选中当前值
  591. let obj2 = this.$refs.xTable.getCheckboxRecords(true);
  592. // 获取之前选中值
  593. let obj = this.$refs.xTable.getCheckboxReserveRecords(true);
  594. if (this.isAll == 0 && this.checkUidList.length <= obj.length && !this.isCheckBox) {
  595. obj = [];
  596. }
  597. obj = obj.concat(obj2);
  598. let ids = [];
  599. obj.forEach((item) => {
  600. ids.push(parseInt(item.id))
  601. })
  602. this.checkUidList = ids;
  603. if (!obj2.length) {
  604. this.isCheckBox = false;
  605. }
  606. },
  607. printOreder() {
  608. if (this.checkUidList.length > 10 || (this.isAll == 1 && this.total > 10)) {
  609. return this.$Message.error('最多批量打印10个订单')
  610. }
  611. let ids = []
  612. if (this.isAll == 1 && this.total <= 10) {
  613. this.orderList.forEach(item => {
  614. ids.push(parseInt(item.id))
  615. })
  616. }
  617. let pathInfo = this.$router.resolve({
  618. path: `${Setting.roterPre}/order/distribution`,
  619. query: {
  620. id: this.isAll == 1 ? ids.join(',') : this.checkUidList.join(','),
  621. }
  622. });
  623. window.open(pathInfo.href, '_blank');
  624. },
  625. reset() {
  626. this.timeVal = [];
  627. this.orderData = {
  628. page: 1,
  629. limit: 10,
  630. type: "",
  631. status: "",
  632. data: "",
  633. real_name: "",
  634. pay_type: "",
  635. field_key: "all",
  636. pay_status: "-1",
  637. pay_img_status:1,
  638. is_level_order:-1,
  639. };
  640. this.getList();
  641. },
  642. queuemModal() {
  643. this.$refs.queue.modal = true;
  644. },
  645. delAll() {
  646. if (this.checkUidList.length === 0 && this.isAll == 0) {
  647. return this.$Message.error('请先选择删除的订单!')
  648. }
  649. let idss = {
  650. all: this.isAll,
  651. ids: this.checkUidList,
  652. }
  653. let delfromData = {
  654. title: "删除订单",
  655. url: `/order/dels`,
  656. method: "post",
  657. ids: idss,
  658. };
  659. this.$modalSure(delfromData).then((res) => {
  660. this.$Message.success(res.msg);
  661. this.allReset();
  662. this.getList();
  663. }).catch((res) => {
  664. this.$Message.error(res.msg);
  665. });
  666. },
  667. onAuto() {
  668. this.$refs.sends.modals = true;
  669. this.$refs.sends.getList();
  670. this.$refs.sends.getDeliveryList();
  671. },
  672. // 订单导出
  673. async exports(value) {
  674. this.exportListOn = this.exportList.findIndex(
  675. (item) => item.name === value
  676. );
  677. let [th, filekey, data, fileName] = [
  678. [],
  679. [],
  680. [], ""
  681. ];
  682. let excelData = JSON.parse(JSON.stringify(this.orderData));
  683. excelData.page = 1;
  684. excelData.type = value;
  685. excelData.ids = this.checkUidList.join();
  686. for (let i = 0; i < excelData.page + 1; i++) {
  687. let lebData = await this.downOrderData(excelData);
  688. if (!fileName) fileName = lebData.filename;
  689. if (!filekey.length) {
  690. filekey = lebData.filekey;
  691. }
  692. if (!th.length) th = lebData.header;
  693. if (lebData.export.length) {
  694. data = data.concat(lebData.export);
  695. excelData.page++;
  696. } else {
  697. exportExcel(th, filekey, fileName, data);
  698. return;
  699. }
  700. }
  701. },
  702. downOrderData(excelData) {
  703. return new Promise((resolve, reject) => {
  704. storeOrderApi(excelData).then((res) => {
  705. return resolve(res.data);
  706. });
  707. });
  708. },
  709. // 订单核销
  710. writeOff() {
  711. this.modals2 = true;
  712. },
  713. // 验证
  714. search(name) {
  715. this.$refs[name].validate((valid) => {
  716. if (valid) {
  717. this.writeOffFrom.confirm = 0;
  718. putWrite(this.writeOffFrom)
  719. .then(async (res) => {
  720. if (res.status === 200) {
  721. this.$Message.success(res.msg);
  722. } else {
  723. this.$Message.error(res.msg);
  724. }
  725. })
  726. .catch((res) => {
  727. this.$Message.error(res.msg);
  728. });
  729. } else {
  730. this.$Message.error("请填写正确的核销码");
  731. }
  732. });
  733. },
  734. // 订单核销
  735. ok() {
  736. if (!this.writeOffFrom.code) {
  737. this.$Message.warning("请先验证订单!");
  738. } else {
  739. this.writeOffFrom.confirm = 1;
  740. putWrite(this.writeOffFrom)
  741. .then(async (res) => {
  742. if (res.status === 200) {
  743. this.$Message.success(res.msg);
  744. this.modals2 = false;
  745. this.$refs[name].resetFields();
  746. this.getList()
  747. } else {
  748. this.$Message.error(res.msg);
  749. }
  750. })
  751. .catch((res) => {
  752. this.$Message.error(res.msg);
  753. });
  754. }
  755. },
  756. del(name) {
  757. this.modals2 = false;
  758. this.writeOffFrom.confirm = 0;
  759. this.$refs[name].resetFields();
  760. },
  761. // 上传头部token
  762. getToken() {
  763. this.uploadHeaders["Authori-zation"] = "Bearer " + util.cookies.get("token");
  764. },
  765. // 上传成功
  766. uploadSuccess(res, file, fileList) {
  767. if (res.status === 200) {
  768. this.$Message.success(res.msg);
  769. this.file = res.data.src;
  770. this.fileList = fileList;
  771. } else {
  772. this.$Message.error(res.msg);
  773. }
  774. },
  775. //移除文件
  776. removeFile(file, fileList) {
  777. this.file = "";
  778. this.fileList = fileList;
  779. },
  780. // 下载物流公司对照表
  781. async getExpressList() {
  782. let [th, filekey, data, fileName] = [
  783. [],
  784. [],
  785. [], ""
  786. ];
  787. let lebData = await this.getExcelData();
  788. if (!fileName) fileName = lebData.filename;
  789. if (!filekey.length) {
  790. filekey = lebData.filekey;
  791. }
  792. if (!th.length) th = lebData.header;
  793. data = lebData.export;
  794. exportExcel(th, filekey, fileName, data);
  795. },
  796. getExcelData() {
  797. return new Promise((resolve, reject) => {
  798. exportExpressList().then((res) => {
  799. return resolve(res.data);
  800. });
  801. });
  802. },
  803. // 手动批量发货-确定
  804. manualModalOk() {
  805. this.$refs.upload.clearFiles();
  806. handBatchDelivery({
  807. file: this.file,
  808. }).then((res) => {
  809. this.$Message.success(res.msg);
  810. this.fileList = [];
  811. }).catch((err) => {
  812. this.$Message.error(err.msg);
  813. this.fileList = [];
  814. });
  815. },
  816. // 手动批量发货-取消
  817. manualModalCancel() {
  818. this.fileList = [];
  819. this.$refs.upload.clearFiles();
  820. },
  821. // 核销订单
  822. bindWrite(row) {
  823. let self = this;
  824. this.$Modal.confirm({
  825. title: "提示",
  826. content: "确定要核销该订单吗?",
  827. cancelText: "取消",
  828. closable: true,
  829. maskClosable: true,
  830. onOk: function() {
  831. writeUpdate(row.order_id).then((res) => {
  832. self.$Message.success(res.msg);
  833. self.getList();
  834. });
  835. },
  836. onCancel: () => {},
  837. });
  838. },
  839. // 配送信息表单数据
  840. delivery(row, num) {
  841. getDistribution(row.id).then(async (res) => {
  842. this.orderConNum = num;
  843. this.orderConId = row.pid;
  844. this.FromData = res.data;
  845. this.$refs.edits.modals = true;
  846. if (num != 1) {
  847. this.getData(this.orderId, 1);
  848. }
  849. }).catch((res) => {
  850. this.$Message.error(res.msg);
  851. });
  852. },
  853. // 编辑
  854. edit(row) {
  855. this.getOrderData(row.id);
  856. },
  857. // 获取编辑表单数据
  858. getOrderData(id) {
  859. getOrdeDatas(id).then(async (res) => {
  860. if (res.data.status === false) {
  861. return this.$authLapse(res.data);
  862. }
  863. this.$authLapse(res.data);
  864. this.FromData = res.data;
  865. this.$refs.edits.modals = true;
  866. }).catch((res) => {
  867. this.$Message.error(res.msg);
  868. });
  869. },
  870. // 发送货
  871. sendOrder(row, num) {
  872. this.orderConId = row.pid;
  873. this.orderConNum = num;
  874. this.$store.commit("store/order/setSplitOrder", row.total_num);
  875. this.$refs.send.modals = true;
  876. this.orderId = row.id;
  877. this.$refs.send.getList();
  878. this.$refs.send.getDeliveryList();
  879. this.$nextTick((e) => {
  880. this.$refs.send.getCartInfo(row._status, row.id);
  881. });
  882. },
  883. // 修改成功
  884. submitFail() {
  885. this.getList();
  886. if (this.orderConNum != 1) {
  887. this.getData(this.orderId, 1);
  888. } else {
  889. this.$refs.detailss.getSplitOrder(this.orderConId);
  890. }
  891. },
  892. // 操作
  893. changeMenu(row, name, num) {
  894. this.orderId = row.id;
  895. this.orderConId = row.pid > 0 ? row.pid : row.id;
  896. this.orderConNum = num;
  897. switch (name) {
  898. case "1":
  899. this.delfromData = {
  900. title: "修改立即支付",
  901. url: `/order/pay_offline/${row.id}`,
  902. method: "post",
  903. ids: "",
  904. };
  905. this.$modalSure(this.delfromData)
  906. .then((res) => {
  907. this.$Message.success(res.msg);
  908. this.getData(row.id, 1);
  909. this.getList();
  910. })
  911. .catch((res) => {
  912. this.$Message.error(res.msg);
  913. });
  914. break;
  915. case "2":
  916. this.rowActive = row;
  917. this.getData(row.id);
  918. break;
  919. case "3":
  920. this.$refs.record.modals = true;
  921. this.$refs.record.getList(row.id);
  922. break;
  923. case "4":
  924. this.$refs.remarks.formValidate.remark = row.remark;
  925. this.$refs.remarks.modals = true;
  926. break;
  927. case "5":
  928. this.getOnlyRefundData(row.id, row.refund_type);
  929. break;
  930. case "55":
  931. this.getRefundData(row.id, row.refund_type);
  932. break;
  933. case "6":
  934. this.getRefundIntegral(row.id);
  935. break;
  936. case "7":
  937. this.getNoRefundData(row.id);
  938. break;
  939. case "8":
  940. this.delfromData = {
  941. title: "修改确认收货",
  942. url: `/order/take/${row.id}`,
  943. method: "put",
  944. ids: "",
  945. };
  946. this.$modalSure(this.delfromData)
  947. .then((res) => {
  948. this.$Message.success(res.msg);
  949. this.getList();
  950. if (num) {
  951. this.$refs.detailss.getSplitOrder(row.pid)
  952. } else {
  953. this.getData(row.id, 1);
  954. }
  955. })
  956. .catch((res) => {
  957. this.$Message.error(res.msg);
  958. });
  959. break;
  960. case "10":
  961. this.delfromData = {
  962. title: "立即打印订单",
  963. info: "您确认打印此订单吗?",
  964. url: `/order/print/${row.id}`,
  965. method: "get",
  966. ids: "",
  967. };
  968. this.$modalSure(this.delfromData)
  969. .then((res) => {
  970. this.$Message.success(res.msg);
  971. this.getList();
  972. })
  973. .catch((res) => {
  974. this.$Message.error(res.msg);
  975. });
  976. break;
  977. case "11":
  978. this.delfromData = {
  979. title: "立即打印电子面单",
  980. info: "您确认打印此电子面单吗?",
  981. url: `/order/order_dump/${row.id}`,
  982. method: "get",
  983. ids: "",
  984. };
  985. this.$modalSure(this.delfromData)
  986. .then((res) => {
  987. this.$Message.success(res.msg);
  988. this.getList();
  989. })
  990. .catch((res) => {
  991. this.$Message.error(res.msg);
  992. });
  993. break;
  994. case "12":
  995. let pathInfo = this.$router.resolve({
  996. path: `${Setting.roterPre}/order/distribution`,
  997. query: {
  998. id: row.id
  999. }
  1000. });
  1001. window.open(pathInfo.href, '_blank');
  1002. break;
  1003. default:
  1004. this.delfromData = {
  1005. title: "删除订单",
  1006. url: `/order/del/${row.id}`,
  1007. method: "DELETE",
  1008. ids: "",
  1009. };
  1010. this.delOrder(row, this.delfromData);
  1011. }
  1012. },
  1013. // 获取详情表单数据
  1014. getData(id, type) {
  1015. getDataInfo(id)
  1016. .then(async (res) => {
  1017. if (!type) {
  1018. this.$refs.detailss.modals = true;
  1019. }
  1020. this.$refs.detailss.activeName = 'detail';
  1021. this.orderDatalist = res.data;
  1022. if (this.orderDatalist.orderInfo.refund_reason_wap_img) {
  1023. try {
  1024. this.orderDatalist.orderInfo.refund_reason_wap_img = JSON.parse(
  1025. this.orderDatalist.orderInfo.refund_reason_wap_img
  1026. );
  1027. } catch (e) {
  1028. this.orderDatalist.orderInfo.refund_reason_wap_img = [];
  1029. }
  1030. }
  1031. })
  1032. .catch((res) => {
  1033. this.$Message.error(res.msg);
  1034. });
  1035. },
  1036. // 仅退款
  1037. getOnlyRefundData(id, refund_type) {
  1038. this.$modalForm(getRefundFrom(id)).then(() => {
  1039. this.getList();
  1040. this.$refs.detailss.modals = false;
  1041. });
  1042. },
  1043. // 退货退款
  1044. getRefundData(id, refund_type) {
  1045. this.delfromData = {
  1046. title: "是否立即退货退款",
  1047. url: `/refund/agree/${id}`,
  1048. method: "get",
  1049. };
  1050. this.$modalSure(this.delfromData)
  1051. .then((res) => {
  1052. this.$Message.success(res.msg);
  1053. this.getList();
  1054. })
  1055. .catch((res) => {
  1056. this.$Message.error(res.msg);
  1057. });
  1058. },
  1059. // 获取退积分表单数据
  1060. getRefundIntegral(id) {
  1061. refundIntegral(id)
  1062. .then(async (res) => {
  1063. this.FromData = res.data;
  1064. this.$refs.edits.modals = true;
  1065. })
  1066. .catch((res) => {
  1067. this.$Message.error(res.msg);
  1068. });
  1069. },
  1070. // 不退款表单数据
  1071. getNoRefundData(id) {
  1072. this.$modalForm(getnoRefund(id)).then(() => {
  1073. this.getList();
  1074. });
  1075. },
  1076. // 删除单条订单
  1077. delOrder(row, data) {
  1078. if (row.is_del === 1) {
  1079. this.$modalSure(data)
  1080. .then((res) => {
  1081. this.$Message.success(res.msg);
  1082. this.getList();
  1083. this.$refs.detailss.modals = false;
  1084. })
  1085. .catch((res) => {
  1086. this.$Message.error(res.msg);
  1087. });
  1088. } else {
  1089. const title = "错误!";
  1090. const content =
  1091. "<p>您选择的的订单存在用户未删除的订单,无法删除用户未删除的订单!</p>";
  1092. this.$Modal.error({
  1093. title: title,
  1094. content: content,
  1095. });
  1096. }
  1097. },
  1098. getList() {
  1099. this.loading = true;
  1100. examine_lst(this.orderData).then(res => {
  1101. let data = res.data;
  1102. data.data.forEach((item) => {
  1103. if (item.id == this.orderId) {
  1104. this.rowActive = item;
  1105. }
  1106. });
  1107. this.$set(this, 'orderList', data.data);
  1108. this.total = res.data.count;
  1109. this.loading = false;
  1110. this.$nextTick(function() {
  1111. if (this.isAll == 1) {
  1112. if (this.isCheckBox) {
  1113. this.$refs.xTable.setAllCheckboxRow(true);
  1114. } else {
  1115. this.$refs.xTable.setAllCheckboxRow(false);
  1116. }
  1117. } else {
  1118. let obj = this.$refs.xTable.getCheckboxReserveRecords(true);
  1119. if (!this.checkUidList.length || this.checkUidList.length <= obj.length) {
  1120. this.$refs.xTable.setAllCheckboxRow(false);
  1121. }
  1122. }
  1123. })
  1124. }).catch(err => {
  1125. this.loading = false;
  1126. this.$Message.error(err.msg)
  1127. })
  1128. },
  1129. // 具体日期
  1130. onchangeTime(e) {
  1131. if (e[1].slice(-8) === "00:00:00") {
  1132. e[1] = e[1].slice(0, -8) + "23:59:59";
  1133. this.timeVal = e;
  1134. } else {
  1135. this.timeVal = e;
  1136. }
  1137. this.orderData.data = this.timeVal[0] ? this.timeVal.join("-") : "";
  1138. this.orderData.page = 1;
  1139. this.allReset();
  1140. this.getList();
  1141. },
  1142. showUserInfo(row) {
  1143. this.$refs.userDetails.modals = true;
  1144. this.$refs.userDetails.activeName = 'info';
  1145. this.$refs.userDetails.getDetails(row.uid);
  1146. },
  1147. pageChange(index) {
  1148. this.orderData.page = index;
  1149. this.getList();
  1150. },
  1151. userSearchs() {
  1152. this.allReset();
  1153. this.orderData.page = 1;
  1154. this.getList();
  1155. }
  1156. },
  1157. };
  1158. </script>
  1159. <style lang="stylus" scoped>
  1160. .tdinfo {
  1161. margin-left: 75px;
  1162. margin-top: 16px;
  1163. }
  1164. .expand-row {
  1165. margin-bottom: 16px;
  1166. font-size: 12px;
  1167. }
  1168. .alertflex{
  1169. display: flex;
  1170. justify-content: flex-start
  1171. flex-wrap: wrap
  1172. }
  1173. .tabBox {
  1174. width: 100%;
  1175. height: 100%;
  1176. display: flex;
  1177. align-items: center;
  1178. .alert_image{
  1179. width: 300px;
  1180. height: 300px;
  1181. img {
  1182. width: 100%;
  1183. height: 100%;
  1184. }
  1185. }
  1186. .tabBox_img {
  1187. width: 30px;
  1188. height: 30px;
  1189. img {
  1190. width: 100%;
  1191. height: 100%;
  1192. }
  1193. }
  1194. .tabBox_tit {
  1195. width: 267px;
  1196. height: 30px;
  1197. line-height: 30px;
  1198. font-size: 12px !important;
  1199. margin: 0 2px 0 10px;
  1200. letter-spacing: 1px;
  1201. box-sizing: border-box;
  1202. }
  1203. }
  1204. .tabBox+.tabBox {
  1205. margin-top: 5px;
  1206. }
  1207. </style>