index.vue 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514
  1. <template>
  2. <div class="app-container">
  3. <el-tabs v-model="activeStatus" @tab-click="handleTabClick">
  4. <el-tab-pane label="全部" name="all"></el-tab-pane>
  5. <el-tab-pane label="未审核" name="1"></el-tab-pane>
  6. <el-tab-pane label="审核通过" name="2"></el-tab-pane>
  7. <el-tab-pane label="已发货" name="3"></el-tab-pane>
  8. <el-tab-pane label="已回款" name="4"></el-tab-pane>
  9. <el-tab-pane label="已取消" name="-3"></el-tab-pane>
  10. </el-tabs>
  11. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="small">
  12. <el-form-item label="订单编号" prop="orderCode">
  13. <el-input v-model="queryParams.orderCode" placeholder="请输入订单号" clearable @keyup.enter.native="handleQuery" />
  14. </el-form-item>
  15. <el-form-item label="所属部门" prop="deptId">
  16. <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
  17. </el-form-item>
  18. <el-form-item label="会员ID" prop="userId">
  19. <el-input v-model="queryParams.userId" placeholder="请输入会员ID" clearable @keyup.enter.native="handleQuery" />
  20. </el-form-item>
  21. <el-form-item label="会员姓名" prop="memberName">
  22. <el-input v-model="queryParams.memberName" placeholder="请输入会员姓名" clearable @keyup.enter.native="handleQuery" />
  23. </el-form-item>
  24. <el-form-item label="会员电话" prop="memberPhone">
  25. <el-input v-model="queryParams.memberPhone" placeholder="请输入会员电话" clearable @keyup.enter.native="handleQuery" />
  26. </el-form-item>
  27. <el-form-item label="销售ID" prop="companyUserId">
  28. <el-input v-model="queryParams.companyUserId" placeholder="请输入销售ID" clearable @keyup.enter.native="handleQuery" />
  29. </el-form-item>
  30. <el-form-item label="销售姓名" prop="companyUserName">
  31. <el-input v-model="queryParams.companyUserName" placeholder="请输入销售姓名" clearable @keyup.enter.native="handleQuery" />
  32. </el-form-item>
  33. <el-form-item label="下单日期" prop="createTime">
  34. <el-date-picker
  35. v-model="createTime"
  36. style="width: 220px"
  37. value-format="yyyy-MM-dd"
  38. type="daterange"
  39. range-separator="-"
  40. start-placeholder="开始日期"
  41. end-placeholder="结束日期"
  42. @change="handleCreateTimeChange"
  43. />
  44. </el-form-item>
  45. <el-form-item label="签收状态" prop="deliveryStatus">
  46. <el-select v-model="queryParams.deliveryStatus" placeholder="请选择签收状态" clearable style="width:200px">
  47. <el-option
  48. v-for="item in deliveryStatusOptions"
  49. :key="item.dictValue"
  50. :label="item.dictLabel"
  51. :value="Number(item.dictValue)"
  52. />
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item label="订购产品" prop="productName">
  56. <el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter.native="handleQuery" />
  57. </el-form-item>
  58. <el-form-item label="地址" prop="address">
  59. <el-input v-model="queryParams.address" placeholder="请输入地址" clearable @keyup.enter.native="handleQuery" />
  60. </el-form-item>
  61. <el-form-item label="定金" prop="payPrice">
  62. <el-input-number v-model="queryParams.payPrice" :precision="2" :min="0" placeholder="请输入定金" style="width:200px" controls-position="right" />
  63. </el-form-item>
  64. <el-form-item label="定金回款时间" prop="depositReturnTime">
  65. <el-date-picker
  66. v-model="depositReturnTime"
  67. style="width: 220px"
  68. value-format="yyyy-MM-dd"
  69. type="daterange"
  70. range-separator="-"
  71. start-placeholder="开始日期"
  72. end-placeholder="结束日期"
  73. @change="handleDepositReturnTimeChange"
  74. />
  75. </el-form-item>
  76. <el-form-item label="商品总额" prop="totalPrice">
  77. <el-input-number v-model="queryParams.totalPrice" :precision="2" :min="0" placeholder="请输入商品总额" style="width:200px" controls-position="right" />
  78. </el-form-item>
  79. <el-form-item label="代收金额" prop="collectionPrice">
  80. <el-input-number v-model="queryParams.collectionPrice" :precision="2" :min="0" placeholder="请输入代收金额" style="width:200px" controls-position="right" />
  81. </el-form-item>
  82. <el-form-item label="备注" prop="remark">
  83. <el-input v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter.native="handleQuery" />
  84. </el-form-item>
  85. <el-form-item label="快递单号" prop="deliverySn">
  86. <el-input v-model="queryParams.deliverySn" placeholder="请输入快递单号" clearable @keyup.enter.native="handleQuery" />
  87. </el-form-item>
  88. <el-form-item label="发货日期" prop="deliveryTime">
  89. <el-date-picker
  90. v-model="deliveryTime"
  91. style="width: 220px"
  92. value-format="yyyy-MM-dd"
  93. type="daterange"
  94. range-separator="-"
  95. start-placeholder="开始日期"
  96. end-placeholder="结束日期"
  97. @change="handleDeliveryTimeChange"
  98. />
  99. </el-form-item>
  100. <el-form-item label="快递公司" prop="deliveryCode">
  101. <el-input v-model="queryParams.deliveryCode" placeholder="请输入快递公司" clearable @keyup.enter.native="handleQuery" />
  102. </el-form-item>
  103. <el-form-item label="快递类型" prop="deliveryName">
  104. <el-input v-model="queryParams.deliveryName" placeholder="请输入快递类型" clearable @keyup.enter.native="handleQuery" />
  105. </el-form-item>
  106. <el-form-item label="跟单时间" prop="followTime">
  107. <el-date-picker
  108. v-model="followTime"
  109. style="width: 220px"
  110. value-format="yyyy-MM-dd"
  111. type="daterange"
  112. range-separator="-"
  113. start-placeholder="开始日期"
  114. end-placeholder="结束日期"
  115. @change="handleFollowTimeChange"
  116. />
  117. </el-form-item>
  118. <el-form-item label="退款金额" prop="refundPrice">
  119. <el-input-number v-model="queryParams.refundPrice" :precision="2" :min="0" placeholder="请输入退款金额" style="width:200px" controls-position="right" />
  120. </el-form-item>
  121. <el-form-item label="退款日期" prop="refundTime">
  122. <el-date-picker
  123. v-model="refundTime"
  124. style="width: 220px"
  125. value-format="yyyy-MM-dd"
  126. type="daterange"
  127. range-separator="-"
  128. start-placeholder="开始日期"
  129. end-placeholder="结束日期"
  130. @change="handleRefundTimeChange"
  131. />
  132. </el-form-item>
  133. <el-form-item label="审核人" prop="auditor">
  134. <el-input v-model="queryParams.auditor" placeholder="请输入审核人" clearable @keyup.enter.native="handleQuery" />
  135. </el-form-item>
  136. <el-form-item label="审核时间" prop="auditTime">
  137. <el-date-picker
  138. v-model="auditTime"
  139. style="width: 220px"
  140. value-format="yyyy-MM-dd"
  141. type="daterange"
  142. range-separator="-"
  143. start-placeholder="开始日期"
  144. end-placeholder="结束日期"
  145. @change="handleAuditTimeChange"
  146. />
  147. </el-form-item>
  148. <el-form-item label="复购次数" prop="memberBuyCountMin">
  149. <el-input-number v-model="queryParams.memberBuyCountMin" :min="0" placeholder="最小次数" style="width:120px" controls-position="right" />
  150. </el-form-item>
  151. <el-form-item label="会员年龄" prop="memberAge">
  152. <el-input-number v-model="queryParams.memberAge" :min="0" placeholder="请输入年龄" style="width:200px" controls-position="right" />
  153. </el-form-item>
  154. <el-form-item label="会员性别" prop="memberSex">
  155. <el-select v-model="queryParams.memberSex" placeholder="请选择性别" clearable style="width:120px">
  156. <el-option label="男" :value="1" />
  157. <el-option label="女" :value="2" />
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item label="病名" prop="diseaseName">
  161. <el-input v-model="queryParams.diseaseName" placeholder="请输入病名" clearable @keyup.enter.native="handleQuery" />
  162. </el-form-item>
  163. <el-form-item label="省市" prop="province">
  164. <el-input v-model="queryParams.province" placeholder="请输入省市" clearable @keyup.enter.native="handleQuery" />
  165. </el-form-item>
  166. <el-form-item label="二级市" prop="city">
  167. <el-input v-model="queryParams.city" placeholder="请输入二级市" clearable @keyup.enter.native="handleQuery" />
  168. </el-form-item>
  169. <el-form-item label="区县" prop="district">
  170. <el-input v-model="queryParams.district" placeholder="请输入区县" clearable @keyup.enter.native="handleQuery" />
  171. </el-form-item>
  172. <el-form-item label="乡镇" prop="township">
  173. <el-input v-model="queryParams.township" placeholder="请输入乡镇" clearable @keyup.enter.native="handleQuery" />
  174. </el-form-item>
  175. <el-form-item>
  176. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  177. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  178. </el-form-item>
  179. </el-form>
  180. <el-row :gutter="10" class="mb8">
  181. <el-col :span="1.5">
  182. <el-button
  183. type="primary"
  184. icon="el-icon-plus"
  185. size="mini"
  186. @click="handleAdd"
  187. v-hasPermi="['his:externalOrder:create']"
  188. >创建外部订单</el-button>
  189. </el-col>
  190. <el-col :span="1.5">
  191. <el-button
  192. type="warning"
  193. plain
  194. icon="el-icon-download"
  195. size="mini"
  196. :loading="exportLoading"
  197. @click="handleExport"
  198. v-hasPermi="['store:externalOrder:export']"
  199. >导出</el-button>
  200. </el-col>
  201. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  202. </el-row>
  203. <el-table ref="orderTable" v-loading="loading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
  204. <el-table-column label="外部订单号" align="center" prop="orderCode" width="170" fixed="left" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
  205. <el-table-column label="会员ID" align="center" prop="userId" width="90" column-key="userId" :filters="getFilters('userId')" :filtered-value="columnFilters.userId" />
  206. <el-table-column label="订单状态" align="center" prop="status" width="100" column-key="status" :filters="statusFilters" :filtered-value="columnFilters.status">
  207. <template slot-scope="scope">
  208. <el-tag v-if="scope.row.status==1" type="warning" size="mini">未审核</el-tag>
  209. <el-tag v-else-if="scope.row.status==2" type="success" size="mini">审核通过</el-tag>
  210. <el-tag v-else-if="scope.row.status==3" type="primary" size="mini">已发货</el-tag>
  211. <el-tag v-else-if="scope.row.status==4" size="mini">已回款</el-tag>
  212. <el-tag v-else-if="scope.row.status==-3" type="danger" size="mini">已取消</el-tag>
  213. <span v-else>-</span>
  214. </template>
  215. </el-table-column>
  216. <el-table-column label="订单类型" align="center" prop="orderType" width="100" column-key="orderType" :filters="orderTypeFilters" :filtered-value="columnFilters.orderType">
  217. <template slot-scope="scope">
  218. <span v-if="scope.row.orderType==1">外部订单</span>
  219. <span v-else-if="scope.row.orderType==2">套餐包</span>
  220. <span v-else-if="scope.row.orderType==3">问诊</span>
  221. <span v-else-if="scope.row.orderType==4">积分</span>
  222. <span v-else>-</span>
  223. </template>
  224. </el-table-column>
  225. <el-table-column label="所属公司" align="center" prop="companyName" width="120" show-overflow-tooltip />
  226. <el-table-column label="部门" align="center" prop="deptName" width="120" show-overflow-tooltip />
  227. <el-table-column label="员工" align="center" prop="companyUserName" width="100" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName" />
  228. <el-table-column label="收货人" align="center" prop="userName" width="90" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
  229. <el-table-column label="会员手机号" align="center" prop="memberPhone" width="130" column-key="memberPhone" :filters="getFilters('memberPhone')" :filtered-value="columnFilters.memberPhone" />
  230. <el-table-column label="会员年龄" align="center" prop="memberAge" width="80" column-key="memberAge" :filters="getFilters('memberAge', null, true)" :filtered-value="columnFilters.memberAge" />
  231. <el-table-column label="会员性别" align="center" prop="memberSex" width="80" column-key="memberSex" :filters="memberSexFilters" :filtered-value="columnFilters.memberSex">
  232. <template slot-scope="scope">
  233. <span v-if="scope.row.memberSex==1">男</span>
  234. <span v-else-if="scope.row.memberSex==2">女</span>
  235. <span v-else>-</span>
  236. </template>
  237. </el-table-column>
  238. <el-table-column label="复购次数" align="center" prop="memberBuyCount" width="80" column-key="memberBuyCount" :filters="getFilters('memberBuyCount', null, true)" :filtered-value="columnFilters.memberBuyCount" />
  239. <el-table-column label="省" align="center" prop="province" width="80" column-key="province" :filters="getFilters('province')" :filtered-value="columnFilters.province" />
  240. <el-table-column label="二级市" align="center" prop="city" width="90" column-key="city" :filters="getFilters('city')" :filtered-value="columnFilters.city" />
  241. <el-table-column label="区县" align="center" prop="district" width="90" column-key="district" :filters="getFilters('district')" :filtered-value="columnFilters.district" />
  242. <el-table-column label="乡镇" align="center" prop="township" width="90" column-key="township" :filters="getFilters('township')" :filtered-value="columnFilters.township" />
  243. <el-table-column label="病名" align="center" prop="diseaseName" width="100" show-overflow-tooltip column-key="diseaseName" :filters="getFilters('diseaseName')" :filtered-value="columnFilters.diseaseName" />
  244. <el-table-column label="商品名称" align="center" prop="productNames" width="200" show-overflow-tooltip column-key="productNames" :filters="getFilters('productNames')" :filtered-value="columnFilters.productNames" />
  245. <el-table-column label="商品总额" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
  246. <el-table-column label="应收金额" align="center" prop="receivablePrice" width="100" column-key="receivablePrice" :filters="getFilters('receivablePrice', null, true)" :filtered-value="columnFilters.receivablePrice" />
  247. <el-table-column label="定金(实收)" align="center" prop="payPrice" width="100" column-key="payPrice" :filters="getFilters('payPrice', null, true)" :filtered-value="columnFilters.payPrice" />
  248. <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
  249. <el-table-column label="支付方式" align="center" prop="payType" width="100" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
  250. <template slot-scope="scope">
  251. <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
  252. </template>
  253. </el-table-column>
  254. <el-table-column label="定金回款时间" align="center" prop="depositReturnTime" width="160" column-key="depositReturnTime" :filters="getDepositReturnTimeFilters()" :filtered-value="columnFilters.depositReturnTime">
  255. <template slot-scope="scope">
  256. <span>{{ scope.row.status == 4 ? scope.row.updateTime : '-' }}</span>
  257. </template>
  258. </el-table-column>
  259. <el-table-column label="创建时间" align="center" prop="externalCreateTime" width="160" column-key="externalCreateTime" :filters="getFilters('externalCreateTime')" :filtered-value="columnFilters.externalCreateTime" />
  260. <el-table-column label="快递单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
  261. <el-table-column label="快递公司" align="center" prop="deliveryCode" width="100" column-key="deliveryCode" :filters="getFilters('deliveryCode')" :filtered-value="columnFilters.deliveryCode" />
  262. <el-table-column label="快递类型" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
  263. <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime" />
  264. <el-table-column label="签收状态" align="center" prop="deliveryStatus" width="100" column-key="deliveryStatus" :filters="deliveryStatusFilters" :filtered-value="columnFilters.deliveryStatus">
  265. <template slot-scope="scope">
  266. <dict-tag v-if="scope.row.deliveryStatus != null" :options="deliveryStatusOptions" :value="scope.row.deliveryStatus" />
  267. <span v-else>-</span>
  268. </template>
  269. </el-table-column>
  270. <el-table-column label="跟单时间" align="center" prop="followTime" width="160" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime" />
  271. <el-table-column label="退款金额" align="center" prop="refundPrice" width="100" column-key="refundPrice" :filters="getFilters('refundPrice', null, true)" :filtered-value="columnFilters.refundPrice" />
  272. <el-table-column label="退款日期" align="center" prop="refundTime" width="160" column-key="refundTime" :filters="getFilters('refundTime')" :filtered-value="columnFilters.refundTime" />
  273. <el-table-column label="拒收回退时间" align="center" prop="rejectReturnTime" width="160" column-key="rejectReturnTime" :filters="getFilters('rejectReturnTime')" :filtered-value="columnFilters.rejectReturnTime" />
  274. <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark" />
  275. <el-table-column label="审核人" align="center" prop="auditor" width="90" column-key="auditor" :filters="getFilters('auditor')" :filtered-value="columnFilters.auditor" />
  276. <el-table-column label="审核时间" align="center" prop="auditTime" width="160" column-key="auditTime" :filters="getFilters('auditTime')" :filtered-value="columnFilters.auditTime" />
  277. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
  278. <template slot-scope="scope">
  279. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:query']" @click="handleView(scope.row)">查看</el-button>
  280. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:audit']" @click="handleAudit(scope.row)" v-if="scope.row.status == 1">审核</el-button>
  281. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:approveOrder']" @click="handleApprove(scope.row)" v-if="scope.row.status == 3 && !scope.row.isApplyAudit && isAbnormalDelivery(scope.row.deliveryType)">申请审核</el-button>
  282. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:express']" @click="handleExpress(scope.row)" v-if="scope.row.deliverySn">查看物流</el-button>
  283. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:cancel']" @click="handleCancel(scope.row)" v-if="scope.row.status != -3">取消订单</el-button>
  284. <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:edit']" @click="handleEdit(scope.row)">订单修改</el-button>
  285. </template>
  286. </el-table-column>
  287. </el-table>
  288. <pagination
  289. v-show="total > 0"
  290. :total="total"
  291. :page.sync="queryParams.pageNum"
  292. :limit.sync="queryParams.pageSize"
  293. @pagination="getList"
  294. />
  295. <el-dialog :title="title" v-if="open" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal="false">
  296. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  297. <el-form-item label="会员信息" prop="userId">
  298. <el-row>
  299. <el-col>
  300. <el-input placeholder="请输入会员手机号" style="width:240px;" v-model="phone"/>
  301. <el-button plain style="margin-left:10px;" @click="searchUser()">查询</el-button>
  302. <el-button plain style="margin-left:10px;" icon="el-icon-plus" type="primary" @click="handleAddUser()" v-hasPermi="['his:user:addExternalUser']">添加外部订单用户</el-button>
  303. </el-col>
  304. </el-row>
  305. <el-radio-group v-model="form.userId" style="width:100%" @change="handleUserChange">
  306. <el-table border style="margin-top:5px;" v-loading="userloading" :data="users">
  307. <el-table-column label="选择" align="center" width="80">
  308. <template slot-scope="scope">
  309. <el-radio :label="scope.row.userId"></el-radio>
  310. </template>
  311. </el-table-column>
  312. <el-table-column label="ID" align="center" prop="userId" />
  313. <el-table-column label="会员头像" align="center" width="80">
  314. <template slot-scope="scope">
  315. <el-popover placement="right" title="" trigger="hover">
  316. <img slot="reference" :src="scope.row.avatar" width="50" >
  317. <img :src="scope.row.avatar" style="max-width: 120px;">
  318. </el-popover>
  319. </template>
  320. </el-table-column>
  321. <el-table-column label="昵称" align="center" prop="nickName" />
  322. <el-table-column label="手机号" align="center" prop="phone" />
  323. <el-table-column label="年龄" align="center">
  324. <template slot-scope="scope">
  325. <span v-if="scope.row.birthday">{{ Math.floor((Date.now() / 1000 - scope.row.birthday) / 31536000) }}</span>
  326. <span v-else>-</span>
  327. </template>
  328. </el-table-column>
  329. <el-table-column label="性别" align="center" prop="sex">
  330. <template slot-scope="scope">
  331. <span v-if="scope.row.sex == 1">男</span>
  332. <span v-else-if="scope.row.sex == 2">女</span>
  333. <span v-else>-</span>
  334. </template>
  335. </el-table-column>
  336. <el-table-column label="状态" align="center" prop="status" >
  337. <template slot-scope="scope">
  338. <el-tag prop="status" v-for="(item, index) in userStatusOptions" :key="index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
  339. </template>
  340. </el-table-column>
  341. </el-table>
  342. </el-radio-group>
  343. </el-form-item>
  344. <el-form-item label="收件人电话" prop="receiverPhone">
  345. <el-input v-model="form.receiverPhone" placeholder="请输入收件人电话" clearable size="small" style="width: 300px;" />
  346. <el-tooltip placement="right" effect="dark" :content="'该手机号会推送给快递公司。被快递公司记录成收件人电话。请按照自己公司下单发货规定,填写坐席电话或者用户电话。填错会查不到物流信息。'">
  347. <span style="color: red; margin-left: 5px; cursor: pointer; font-weight: bold;">*</span>
  348. </el-tooltip>
  349. </el-form-item>
  350. <el-form-item label="收货信息" prop="addressId">
  351. <el-row>
  352. <el-col>
  353. <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()" v-hasPermi="['his:userAddress:add']">添加收货地址</el-button>
  354. </el-col>
  355. </el-row>
  356. <el-radio-group v-model="form.addressId" style="width:100%">
  357. <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
  358. <el-table-column label="ID" align="center" >
  359. <template slot-scope="scope">
  360. <el-radio :label="scope.row.addressId"></el-radio>
  361. </template>
  362. </el-table-column>
  363. <el-table-column label="收货人姓名" align="center" prop="realName" />
  364. <el-table-column label="收货人所在省" align="center" prop="province" />
  365. <el-table-column label="收货人所在市" align="center" prop="city" />
  366. <el-table-column label="收货人所在区" align="center" prop="district" />
  367. <el-table-column label="乡镇" align="center" prop="township" />
  368. <el-table-column label="收货人详细地址" align="center" prop="detail" />
  369. </el-table>
  370. </el-radio-group>
  371. </el-form-item>
  372. <el-form-item label="商品信息" prop="productList">
  373. <el-select v-model="selectedStoreId" placeholder="请选择店铺" clearable size="small" @change="handleStoreChange" style="width: 200px;">
  374. <el-option
  375. v-for="item in storeOptions"
  376. :key="item.dictValue"
  377. :label="item.dictLabel"
  378. :value="item.dictValue"
  379. />
  380. </el-select>
  381. <div style="float: right;"><el-button plain type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button></div>
  382. <el-table border width="100%" style="margin-top:5px;" :data="drugList">
  383. <el-table-column label="商品图片" align="center" width="100">
  384. <template slot-scope="scope">
  385. <el-popover placement="right" title="" trigger="hover">
  386. <img slot="reference" :src="scope.row.imgUrl" width="50">
  387. <img :src="scope.row.imgUrl" style="max-width: 50px;">
  388. </el-popover>
  389. </template>
  390. </el-table-column>
  391. <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
  392. <el-table-column label="数量" align="center" prop="count" width="150px">
  393. <template slot-scope="scope">
  394. <el-input-number v-model="scope.row.count" @change="handleProductCountChange(scope.row)" size="small" :min="1"></el-input-number>
  395. </template>
  396. </el-table-column>
  397. <el-table-column label="售价" align="center" prop="price" width="150px">
  398. <template slot-scope="scope">
  399. <el-input-number v-model="scope.row.price" @change="handleProductCountChange(scope.row)" size="small" :min="0" :precision="2"></el-input-number>
  400. </template>
  401. </el-table-column>
  402. <el-table-column label="小计" align="center" prop="money">
  403. <template slot-scope="scope">
  404. <div v-if="scope.row.money != null">{{ scope.row.money.toFixed(2) }}</div>
  405. </template>
  406. </el-table-column>
  407. <el-table-column label="操作" align="center" width="100px" fixed="right">
  408. <template slot-scope="scope">
  409. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleProductDelete(scope.row)">删除</el-button>
  410. </template>
  411. </el-table-column>
  412. </el-table>
  413. </el-form-item>
  414. <el-form-item label="支付方式" prop="payType">
  415. <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
  416. <el-option
  417. v-for="item in payTypeOptions"
  418. :key="item.dictValue"
  419. :label="item.dictLabel"
  420. :value="item.dictValue"
  421. />
  422. </el-select>
  423. </el-form-item>
  424. <el-form-item label="商品总额" prop="totalPrice">
  425. <el-input v-model="form.totalPrice" placeholder="请输入商品总额" clearable size="small" style="width: 200px;" />
  426. </el-form-item>
  427. <el-form-item :label="form.payType == 3 ? '定金' : '支付金额'" prop="payMoney">
  428. <el-input v-model="form.payMoney" placeholder="请输入支付金额" clearable size="small" style="width: 200px;" />
  429. </el-form-item>
  430. </el-form>
  431. <div slot="footer" class="dialog-footer">
  432. <el-button type="primary" @click="submitForm">确 定</el-button>
  433. <el-button @click="cancel">取 消</el-button>
  434. </div>
  435. </el-dialog>
  436. <el-dialog title="订单详情" v-if="detailOpen" :visible.sync="detailOpen" width="1000px" append-to-body>
  437. <el-descriptions :column="3" border size="small">
  438. <el-descriptions-item label="外部订单号">{{ detailData.orderCode }}</el-descriptions-item>
  439. <el-descriptions-item label="订单状态">
  440. <el-tag v-if="detailData.status==1" type="warning" size="mini">未审核</el-tag>
  441. <el-tag v-else-if="detailData.status==2" type="success" size="mini">审核通过</el-tag>
  442. <el-tag v-else-if="detailData.status==3" type="primary" size="mini">已发货</el-tag>
  443. <el-tag v-else-if="detailData.status==4" size="mini">已回款</el-tag>
  444. <el-tag v-else-if="detailData.status==-3" type="danger" size="mini">已取消</el-tag>
  445. </el-descriptions-item>
  446. <el-descriptions-item label="订单类型">
  447. <span v-if="detailData.orderType==1">外部订单</span>
  448. <span v-else-if="detailData.orderType==2">套餐包</span>
  449. <span v-else-if="detailData.orderType==3">问诊</span>
  450. <span v-else-if="detailData.orderType==4">积分</span>
  451. <span v-else>-</span>
  452. </el-descriptions-item>
  453. <el-descriptions-item label="所属公司">{{ detailData.companyName }}</el-descriptions-item>
  454. <el-descriptions-item label="部门">{{ detailData.deptName || '-' }}</el-descriptions-item>
  455. <el-descriptions-item label="员工">{{ detailData.companyUserName }}</el-descriptions-item>
  456. <el-descriptions-item label="收货人">{{ detailData.userName }}</el-descriptions-item>
  457. <el-descriptions-item label="收货人电话">{{ detailData.userPhone }}</el-descriptions-item>
  458. <el-descriptions-item label="会员ID">{{ detailData.userId || '-' }}</el-descriptions-item>
  459. <el-descriptions-item label="会员手机号">{{ detailData.memberPhone || '-' }}</el-descriptions-item>
  460. <el-descriptions-item label="会员年龄">{{ detailData.memberAge || '-' }}</el-descriptions-item>
  461. <el-descriptions-item label="会员性别">
  462. <span v-if="detailData.memberSex==1">男</span>
  463. <span v-else-if="detailData.memberSex==2">女</span>
  464. <span v-else>-</span>
  465. </el-descriptions-item>
  466. <el-descriptions-item label="复购次数">{{ detailData.memberBuyCount != null ? detailData.memberBuyCount : '-' }}</el-descriptions-item>
  467. <el-descriptions-item label="病名">{{ detailData.diseaseName || '-' }}</el-descriptions-item>
  468. <el-descriptions-item label="省">{{ detailData.province || '-' }}</el-descriptions-item>
  469. <el-descriptions-item label="二级市">{{ detailData.city || '-' }}</el-descriptions-item>
  470. <el-descriptions-item label="区县">{{ detailData.district || '-' }}</el-descriptions-item>
  471. <el-descriptions-item label="乡镇">{{ detailData.township || '-' }}</el-descriptions-item>
  472. <el-descriptions-item label="收货地址" :span="2">{{ detailData.userAddress }}</el-descriptions-item>
  473. <el-descriptions-item label="商品总额">{{ detailData.totalPrice }}</el-descriptions-item>
  474. <el-descriptions-item label="应收金额">{{ detailData.receivablePrice }}</el-descriptions-item>
  475. <el-descriptions-item label="定金(实收)">{{ detailData.payPrice }}</el-descriptions-item>
  476. <el-descriptions-item label="代收金额">{{ detailData.collectionPrice != null ? detailData.collectionPrice : '-' }}</el-descriptions-item>
  477. <el-descriptions-item label="支付方式">
  478. <dict-tag :options="payTypeOptions" :value="detailData.payType" />
  479. </el-descriptions-item>
  480. <el-descriptions-item label="定金回款时间">{{ detailData.status == 4 ? detailData.updateTime : '-' }}</el-descriptions-item>
  481. <el-descriptions-item label="创建时间">{{ detailData.externalCreateTime }}</el-descriptions-item>
  482. <el-descriptions-item label="快递单号">{{ detailData.deliverySn || '-' }}</el-descriptions-item>
  483. <el-descriptions-item label="快递公司">{{ detailData.deliveryCode || '-' }}</el-descriptions-item>
  484. <el-descriptions-item label="快递类型">{{ detailData.deliveryName || '-' }}</el-descriptions-item>
  485. <el-descriptions-item label="发货日期">{{ detailData.deliveryTime || '-' }}</el-descriptions-item>
  486. <el-descriptions-item label="签收状态">
  487. <dict-tag v-if="detailData.deliveryStatus != null" :options="deliveryStatusOptions" :value="detailData.deliveryStatus" />
  488. <span v-else>-</span>
  489. </el-descriptions-item>
  490. <el-descriptions-item label="跟单时间">{{ detailData.followTime || '-' }}</el-descriptions-item>
  491. <el-descriptions-item label="退款金额">{{ detailData.refundPrice != null ? detailData.refundPrice : '-' }}</el-descriptions-item>
  492. <el-descriptions-item label="退款日期">{{ detailData.refundTime || '-' }}</el-descriptions-item>
  493. <el-descriptions-item label="拒收回退时间">{{ detailData.rejectReturnTime || '-' }}</el-descriptions-item>
  494. <el-descriptions-item label="审核人">{{ detailData.auditor || '-' }}</el-descriptions-item>
  495. <el-descriptions-item label="审核时间">{{ detailData.auditTime || '-' }}</el-descriptions-item>
  496. <el-descriptions-item label="备注" :span="3">{{ detailData.remark || '-' }}</el-descriptions-item>
  497. </el-descriptions>
  498. <el-divider content-position="left">商品信息</el-divider>
  499. <el-table border :data="detailData.productList || []" size="small">
  500. <el-table-column label="商品名称" align="center" prop="productName" />
  501. <el-table-column label="规格" align="center" prop="productSpec" />
  502. <el-table-column label="商品价格" align="center" prop="price" />
  503. <el-table-column label="数量" align="center" prop="num" />
  504. <el-table-column label="小计" align="center">
  505. <template slot-scope="scope">
  506. {{ (scope.row.price * scope.row.num).toFixed(2) }}
  507. </template>
  508. </el-table-column>
  509. </el-table>
  510. </el-dialog>
  511. <el-dialog :title="expressDialog.title" :visible.sync="expressDialog.open" width="700px" append-to-body>
  512. <div style="margin-bottom: 10px;">
  513. <el-button
  514. size="mini"
  515. type="primary"
  516. v-hasPermi="['store:externalOrder:syncExpress']"
  517. @click="handleSyncExpress(expressDialog.row)"
  518. v-if="expressDialog.row && expressDialog.row.deliverySn"
  519. >同步快递鸟物流状态</el-button>
  520. </div>
  521. <el-table style="width: 100%" :data="traces" border>
  522. <el-table-column label="操作时间" width="160" align="center" prop="AcceptTime" />
  523. <el-table-column label="位置" align="center" prop="Location" />
  524. <el-table-column label="描述" align="center" prop="AcceptStation" />
  525. </el-table>
  526. </el-dialog>
  527. <el-dialog :title="user.title" v-if="user.open" :visible.sync="user.open" width="500px" append-to-body>
  528. <add-external-user @addUser="addUser" />
  529. </el-dialog>
  530. <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
  531. <add-external-user-address ref="addExternalUserAddress" @addUserAddress="addUserAddress" />
  532. </el-dialog>
  533. <el-dialog title="申请审核" :visible.sync="approveOpen" width="600px" append-to-body :close-on-click-modal="false">
  534. <el-form ref="approveForm" :model="approveForm" :rules="approveRules" label-width="120px">
  535. <el-form-item label="审核类型" prop="auditType">
  536. <el-radio-group v-model="approveForm.auditType">
  537. <el-radio :label="1">申请改价</el-radio>
  538. <el-radio :label="2">订单完成</el-radio>
  539. </el-radio-group>
  540. </el-form-item>
  541. <template v-if="approveForm.auditType === 1">
  542. <el-form-item label="原价格">
  543. <el-input v-model="approveForm.oldTotalPrice" disabled style="width: 200px;" />
  544. </el-form-item>
  545. <el-form-item label="更改后总价" prop="newTotalPrice">
  546. <el-input-number v-model="approveForm.newTotalPrice" :precision="2" :min="0" style="width: 200px;" />
  547. </el-form-item>
  548. <el-form-item label="更改后实收" prop="newPayPrice">
  549. <el-input-number v-model="approveForm.newPayPrice" :precision="2" :min="0" style="width: 200px;" />
  550. </el-form-item>
  551. </template>
  552. <el-form-item label="申请原因" prop="priceChangeReason">
  553. <el-input v-model="approveForm.priceChangeReason" type="textarea" :rows="3" placeholder="请输入申请原因" />
  554. </el-form-item>
  555. <el-form-item label="凭证图片">
  556. <el-upload
  557. class="avatar-uploader"
  558. :action="uploadUrl"
  559. :headers="headers"
  560. :show-file-list="false"
  561. :on-success="handleUploadSuccess"
  562. accept="image/*"
  563. >
  564. <img v-if="approveForm.voucherImages" :src="approveForm.voucherImages" style="max-width: 200px; max-height: 200px;">
  565. <el-button v-else size="small" type="primary">点击上传</el-button>
  566. </el-upload>
  567. </el-form-item>
  568. <el-form-item label="凭证说明">
  569. <el-input v-model="approveForm.voucherRemark" type="textarea" :rows="2" placeholder="请输入凭证说明" />
  570. </el-form-item>
  571. </el-form>
  572. <div slot="footer" class="dialog-footer">
  573. <el-button @click="approveOpen = false">取 消</el-button>
  574. <el-button type="primary" @click="submitApprove">确 定</el-button>
  575. </div>
  576. </el-dialog>
  577. <el-dialog title="选择商品" :visible.sync="productDialogVisible" width="900px" append-to-body>
  578. <el-row style="margin-bottom: 10px;">
  579. <el-input v-model="productSearchKeyword" placeholder="请输入商品名称搜索" clearable size="small" style="width: 300px;" @keyup.enter.native="searchProductDialog" />
  580. <el-button type="primary" size="small" style="margin-left: 10px;" @click="searchProductDialog">搜索</el-button>
  581. </el-row>
  582. <el-table border :data="productDialogList" @row-click="selectProduct" highlight-current-row style="cursor: pointer;">
  583. <el-table-column label="商品图片" align="center" width="100">
  584. <template slot-scope="scope">
  585. <el-popover placement="right" title="" trigger="hover">
  586. <img slot="reference" :src="scope.row.imgUrl" width="50">
  587. <img :src="scope.row.imgUrl" style="max-width: 150px;">
  588. </el-popover>
  589. </template>
  590. </el-table-column>
  591. <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
  592. <el-table-column label="售价" align="center" prop="price" width="120" />
  593. <el-table-column label="库存" align="center" prop="stock" width="100" />
  594. </el-table>
  595. <pagination
  596. v-show="productDialogTotal > 0"
  597. :total="productDialogTotal"
  598. :page.sync="productDialogPage.pageNum"
  599. :limit.sync="productDialogPage.pageSize"
  600. @pagination="getProductDialogList"
  601. />
  602. </el-dialog>
  603. <el-dialog title="订单修改" v-if="editOpen" :visible.sync="editOpen" width="600px" append-to-body :close-on-click-modal="false">
  604. <el-form ref="editForm" :model="editForm" label-width="120px">
  605. <el-form-item label="订单状态">
  606. <el-select v-model="editForm.status" placeholder="请选择订单状态" clearable size="small" style="width:200px;">
  607. <el-option label="未审核" :value="1" />
  608. <el-option label="审核通过" :value="2" />
  609. <el-option label="已发货" :value="3" />
  610. <el-option label="已回款" :value="4" />
  611. <el-option label="已取消" :value="-3" />
  612. </el-select>
  613. </el-form-item>
  614. <el-form-item label="跟单时间">
  615. <el-date-picker v-model="editForm.followTime" type="datetime" placeholder="请选择跟单时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
  616. </el-form-item>
  617. <el-form-item label="快递类型">
  618. <el-input v-model="editForm.deliveryName" placeholder="请输入快递类型" clearable size="small" style="width:200px;" />
  619. </el-form-item>
  620. <el-form-item label="签收状态">
  621. <el-select v-model="editForm.deliveryStatus" placeholder="请选择签收状态" clearable size="small" style="width:200px;">
  622. <el-option
  623. v-for="item in deliveryStatusOptions"
  624. :key="item.dictValue"
  625. :label="item.dictLabel"
  626. :value="Number(item.dictValue)"
  627. />
  628. </el-select>
  629. </el-form-item>
  630. <el-form-item label="代收金额">
  631. <el-input-number v-model="editForm.collectionPrice" :precision="2" :min="0" size="small" style="width:200px;" />
  632. </el-form-item>
  633. <el-form-item label="定金回款时间" v-if="editForm.status == 4">
  634. <el-date-picker v-model="editForm.updateTime" type="datetime" placeholder="请选择回款时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
  635. </el-form-item>
  636. <el-form-item label="备注">
  637. <el-input v-model="editForm.remark" type="textarea" :rows="3" placeholder="请输入备注" style="width:350px;" />
  638. </el-form-item>
  639. <el-form-item label="快递公司">
  640. <el-input v-model="editForm.deliveryCode" placeholder="请输入快递公司编号" clearable size="small" style="width:200px;" />
  641. </el-form-item>
  642. <el-form-item label="退款金额">
  643. <el-input-number v-model="editForm.refundPrice" :precision="2" :min="0" size="small" style="width:200px;" />
  644. </el-form-item>
  645. <el-form-item label="退款日期">
  646. <el-date-picker v-model="editForm.refundTime" type="datetime" placeholder="请选择退款日期" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
  647. </el-form-item>
  648. <el-form-item label="拒收回退时间" v-if="showRejectReturnTime">
  649. <el-date-picker v-model="editForm.rejectReturnTime" type="datetime" placeholder="请选择拒收回退时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
  650. </el-form-item>
  651. <el-form-item label="是否还货" v-if="showReturnGoods">
  652. <el-select v-model="editForm.isReturnGoods" placeholder="请选择是否还货" clearable size="small" style="width:200px;">
  653. <el-option label="是" :value="1" />
  654. <el-option label="否" :value="2" />
  655. </el-select>
  656. </el-form-item>
  657. <el-form-item label="病名">
  658. <el-input v-model="editForm.diseaseName" placeholder="请输入病名" clearable size="small" style="width:200px;" />
  659. </el-form-item>
  660. </el-form>
  661. <div slot="footer" class="dialog-footer">
  662. <el-button @click="editOpen = false">取 消</el-button>
  663. <el-button type="primary" @click="submitEditConfirm">确 定</el-button>
  664. </div>
  665. </el-dialog>
  666. <el-dialog title="确认修改" :visible.sync="editConfirmOpen" width="360px" append-to-body>
  667. <span>确认修改该订单信息吗?</span>
  668. <div slot="footer" class="dialog-footer">
  669. <el-button @click="editConfirmOpen = false">取 消</el-button>
  670. <el-button type="primary" @click="submitEdit">确 认</el-button>
  671. </div>
  672. </el-dialog>
  673. </div>
  674. </template>
  675. <script>
  676. import { listExternalOrder, createExternalOrder, getExternalOrder, auditExternalOrder, cancelExternalOrder, approveExternalOrder, exportExternalOrder, getExternalOrderExpress, syncExternalOrderExpress, editExternalOrder } from "@/api/store/externalOrder";
  677. import { getCompanyList } from "@/api/company/company";
  678. import { listUserAddress } from "@/api/store/userAddress";
  679. import { listStoreProduct, listStore } from "@/api/store/storeProduct";
  680. import { treeselect } from "@/api/company/companyDept";
  681. import Treeselect from "@riophae/vue-treeselect";
  682. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  683. import addExternalUserAddress from "@/views/store/components/addExternalUserAddress.vue";
  684. import addExternalUser from "@/views/store/components/addExternalUser.vue";
  685. import request from '@/utils/request';
  686. export default {
  687. name: "ExternalOrder",
  688. components: { addExternalUserAddress, addExternalUser, Treeselect },
  689. data() {
  690. return {
  691. activeStatus: "all",
  692. loading: true,
  693. exportLoading: false,
  694. showSearch: true,
  695. total: 0,
  696. orderList: [],
  697. companyList: [],
  698. open: false,
  699. title: "",
  700. detailOpen: false,
  701. detailData: {},
  702. expressDialog: {
  703. title: "物流信息",
  704. open: false,
  705. row: null
  706. },
  707. express: null,
  708. traces: [],
  709. phone: null,
  710. userloading: false,
  711. users: [],
  712. address: [],
  713. addressloading: false,
  714. drugList: [],
  715. storeOptions: [],
  716. selectedStoreId: null,
  717. productDialogVisible: false,
  718. productSearchKeyword: null,
  719. productDialogList: [],
  720. productDialogTotal: 0,
  721. productDialogPage: {
  722. pageNum: 1,
  723. pageSize: 10
  724. },
  725. user: {
  726. open: false,
  727. title: "创建外部订单用户"
  728. },
  729. userAddress: {
  730. open: false,
  731. title: "创建收货地址"
  732. },
  733. queryParams: {
  734. pageNum: 1,
  735. pageSize: 10,
  736. orderCode: null,
  737. deptId: null,
  738. userId: null,
  739. memberName: null,
  740. memberPhone: null,
  741. memberSex: null,
  742. memberAge: null,
  743. memberBuyCountMin: null,
  744. companyUserId: null,
  745. companyUserName: null,
  746. address: null,
  747. productName: null,
  748. payPrice: null,
  749. totalPrice: null,
  750. collectionPrice: null,
  751. refundPrice: null,
  752. deliverySn: null,
  753. deliveryCode: null,
  754. deliveryName: null,
  755. deliveryStatus: null,
  756. auditor: null,
  757. diseaseName: null,
  758. remark: null,
  759. province: null,
  760. city: null,
  761. district: null,
  762. township: null,
  763. sTime: null,
  764. eTime: null,
  765. deliveryStartTime: null,
  766. deliveryEndTime: null,
  767. depositReturnTimeStart: null,
  768. depositReturnTimeEnd: null,
  769. followTimeStart: null,
  770. followTimeEnd: null,
  771. refundTimeStart: null,
  772. refundTimeEnd: null,
  773. auditTimeStart: null,
  774. auditTimeEnd: null,
  775. rejectReturnTimeStart: null,
  776. rejectReturnTimeEnd: null,
  777. // 以下为列头筛选用字段
  778. orderType: null,
  779. payType: null,
  780. userName: null,
  781. memberBuyCount: null,
  782. receivablePrice: null
  783. },
  784. createTime: null,
  785. deliveryTime: null,
  786. depositReturnTime: null,
  787. followTime: null,
  788. refundTime: null,
  789. auditTime: null,
  790. form: {
  791. addressId: null,
  792. userId: null,
  793. receiverPhone: null,
  794. payType: null,
  795. totalPrice: null,
  796. payMoney: null,
  797. products: []
  798. },
  799. rules: {
  800. addressId: [{ required: true, message: "请选择收货地址", trigger: "change" }],
  801. userId: [{ required: true, message: "请选择会员", trigger: "change" }],
  802. receiverPhone: [{ required: true, message: "请输入收件人电话", trigger: "blur" }],
  803. payType: [{ required: true, message: "支付方式不能为空", trigger: "change" }],
  804. payMoney: [{ required: true, message: "支付金额不能为空", trigger: "blur" }]
  805. },
  806. approveOpen: false,
  807. approveForm: {
  808. orderIds: [],
  809. auditType: 1,
  810. oldTotalPrice: null,
  811. newTotalPrice: null,
  812. newPayPrice: null,
  813. priceChangeReason: null,
  814. voucherImages: null,
  815. voucherRemark: null
  816. },
  817. approveRules: {
  818. auditType: [
  819. { required: true, message: "请选择审核类型", trigger: "change" }
  820. ],
  821. newTotalPrice: [
  822. { required: true, message: "请输入更改后总价", trigger: "blur" }
  823. ],
  824. newPayPrice: [
  825. { required: true, message: "请输入更改后实收", trigger: "blur" }
  826. ],
  827. priceChangeReason: [
  828. { required: true, message: "请输入申请原因", trigger: "blur" }
  829. ]
  830. },
  831. uploadUrl: process.env.VUE_APP_BASE_API + "/common/upload",
  832. headers: { Authorization: "Bearer " + this.$store.getters.token },
  833. payTypeOptions: [],
  834. deliveryStatusOptions: [],
  835. deliveryTypeOptions: [],
  836. userStatusOptions: [],
  837. deptOptions: [],
  838. // 列头筛选-枚举字段展示文案映射
  839. statusMap: { 1: '未审核', 2: '审核通过', 3: '已发货', 4: '已回款', '-3': '已取消' },
  840. orderTypeMap: { 1: '外部订单', 2: '套餐包', 3: '问诊', 4: '积分' },
  841. memberSexMap: { 1: '男', 2: '女' },
  842. // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
  843. columnFilters: {
  844. orderCode: [], userId: [], status: [], orderType: [],
  845. companyUserName: [], userName: [], memberPhone: [], memberAge: [],
  846. memberSex: [], memberBuyCount: [], province: [], city: [],
  847. district: [], township: [], diseaseName: [], productNames: [],
  848. totalPrice: [], receivablePrice: [], payPrice: [], collectionPrice: [],
  849. payType: [], depositReturnTime: [], externalCreateTime: [],
  850. deliverySn: [], deliveryCode: [], deliveryName: [], deliveryTime: [],
  851. deliveryStatus: [], followTime: [], refundPrice: [], refundTime: [],
  852. rejectReturnTime: [], remark: [], auditor: [], auditTime: []
  853. },
  854. editOpen: false,
  855. editConfirmOpen: false,
  856. editForm: {
  857. orderId: null,
  858. status: null,
  859. followTime: null,
  860. deliveryName: null,
  861. deliveryStatus: null,
  862. collectionPrice: null,
  863. updateTime: null,
  864. remark: null,
  865. deliveryCode: null,
  866. refundPrice: null,
  867. refundTime: null,
  868. rejectReturnTime: null,
  869. diseaseName: null,
  870. isReturnGoods: null
  871. }
  872. };
  873. },
  874. computed: {
  875. showRejectReturnTime() {
  876. if (this.editForm.deliveryStatus == null) return false;
  877. const statusItem = this.deliveryStatusOptions.find(item => Number(item.dictValue) === this.editForm.deliveryStatus);
  878. if (statusItem) {
  879. const label = statusItem.dictLabel;
  880. return ['已拒收', '已退回', '退回签收'].includes(label);
  881. }
  882. return false;
  883. },
  884. showReturnGoods() {
  885. if (this.editForm.deliveryStatus == null) return false;
  886. const statusItem = this.deliveryStatusOptions.find(item => Number(item.dictValue) === this.editForm.deliveryStatus);
  887. if (statusItem) {
  888. return statusItem.dictLabel === '已拒收';
  889. }
  890. return false;
  891. },
  892. // 订单状态-全量枚举筛选项
  893. statusFilters() {
  894. return Object.keys(this.statusMap).map(k => ({ text: this.statusMap[k], value: Number(k) }));
  895. },
  896. // 订单类型-全量枚举筛选项
  897. orderTypeFilters() {
  898. return Object.keys(this.orderTypeMap).map(k => ({ text: this.orderTypeMap[k], value: Number(k) }));
  899. },
  900. // 会员性别-全量枚举筛选项
  901. memberSexFilters() {
  902. return Object.keys(this.memberSexMap).map(k => ({ text: this.memberSexMap[k], value: Number(k) }));
  903. },
  904. // 支付方式-全量字典筛选项
  905. payTypeFilters() {
  906. return (this.payTypeOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
  907. },
  908. // 签收状态-全量字典筛选项
  909. deliveryStatusFilters() {
  910. return (this.deliveryStatusOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
  911. }
  912. },
  913. created() {
  914. this.getList();
  915. this.getCompanyList();
  916. this.getDicts("sys_package_pay_type").then(response => {
  917. this.payTypeOptions = response.data;
  918. });
  919. this.getDicts("sys_store_order_delivery_status").then(response => {
  920. this.deliveryStatusOptions = response.data;
  921. });
  922. this.getDicts("sys_delivery_type").then(response => {
  923. this.deliveryTypeOptions = response.data;
  924. });
  925. this.getDicts("sys_company_status").then(response => {
  926. this.userStatusOptions = response.data;
  927. });
  928. this.getTreeselect();
  929. },
  930. methods: {
  931. handleTabClick(tab) {
  932. if (tab.name === "all") {
  933. this.queryParams.status = null;
  934. } else {
  935. this.queryParams.status = tab.name;
  936. }
  937. // 切换 tab 时清空列头筛选,避免与 tab 状态筛选冲突
  938. this.resetColumnFilters();
  939. this.handleQuery();
  940. },
  941. getList() {
  942. this.loading = true;
  943. const params = { ...this.queryParams };
  944. // el-input-number 清空后默认值为0,需转为null避免作为筛选条件传给后端
  945. const numFields = ['memberAge', 'memberBuyCountMin', 'payPrice', 'totalPrice', 'collectionPrice', 'refundPrice'];
  946. numFields.forEach(f => { if (params[f] === 0) params[f] = null; });
  947. listExternalOrder(params).then(response => {
  948. this.orderList = response.rows;
  949. this.total = response.total;
  950. this.loading = false;
  951. }).catch(() => {
  952. this.loading = false;
  953. });
  954. },
  955. /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
  956. getFilters(prop, labelMap = null, sort = false) {
  957. if (!this.orderList || this.orderList.length === 0) return [];
  958. const seen = new Map();
  959. this.orderList.forEach(item => {
  960. const v = item[prop];
  961. if (v === null || v === undefined || v === '') return;
  962. if (!seen.has(v)) seen.set(v, true);
  963. });
  964. let keys = Array.from(seen.keys());
  965. if (sort) {
  966. keys.sort((a, b) => Number(a) - Number(b));
  967. }
  968. return keys.map(v => ({
  969. text: labelMap ? (labelMap[v] || String(v)) : String(v),
  970. value: v
  971. }));
  972. },
  973. /** 定金回款时间筛选项(仅 status==4 显示 updateTime,否则显示 -) */
  974. getDepositReturnTimeFilters() {
  975. if (!this.orderList || this.orderList.length === 0) return [];
  976. const seen = new Map();
  977. this.orderList.forEach(item => {
  978. const v = item.status == 4 ? item.updateTime : '-';
  979. if (v === null || v === undefined || v === '') return;
  980. if (!seen.has(v)) seen.set(v, true);
  981. });
  982. return Array.from(seen.keys()).map(v => ({ text: String(v), value: v }));
  983. },
  984. /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
  985. handleFilterChange(filters) {
  986. // 时间字段:选中值当天范围映射
  987. const timeRangeMap = {
  988. externalCreateTime: ['sTime', 'eTime'],
  989. deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
  990. followTime: ['followTimeStart', 'followTimeEnd'],
  991. refundTime: ['refundTimeStart', 'refundTimeEnd'],
  992. auditTime: ['auditTimeStart', 'auditTimeEnd'],
  993. depositReturnTime: ['depositReturnTimeStart', 'depositReturnTimeEnd'],
  994. rejectReturnTime: ['rejectReturnTimeStart', 'rejectReturnTimeEnd']
  995. };
  996. // 列 column-key 到 queryParams 字段名的映射(特殊映射)
  997. const fieldMap = {
  998. productNames: 'productName'
  999. };
  1000. Object.keys(filters).forEach(key => {
  1001. const vals = filters[key] || [];
  1002. // 单选:只保留最后选中的一项
  1003. const last = vals.length > 0 ? vals[vals.length - 1] : null;
  1004. this.$set(this.columnFilters, key, last != null ? [last] : []);
  1005. if (timeRangeMap[key]) {
  1006. const [startField, endField] = timeRangeMap[key];
  1007. if (last != null && String(last).length >= 10) {
  1008. const day = String(last).substring(0, 10);
  1009. this.queryParams[startField] = day + ' 00:00:00';
  1010. this.queryParams[endField] = day + ' 23:59:59';
  1011. } else {
  1012. this.queryParams[startField] = null;
  1013. this.queryParams[endField] = null;
  1014. }
  1015. } else {
  1016. const fieldName = fieldMap[key] || key;
  1017. this.queryParams[fieldName] = last;
  1018. }
  1019. });
  1020. this.handleQuery();
  1021. },
  1022. /** 重置所有列头筛选选中状态 */
  1023. resetColumnFilters() {
  1024. Object.keys(this.columnFilters).forEach(key => {
  1025. this.columnFilters[key] = [];
  1026. });
  1027. },
  1028. /** 合计行:对金额/数量列求和(基于当前页数据) */
  1029. getSummaries({ columns, data }) {
  1030. const sums = [];
  1031. const sumProps = ['totalPrice', 'receivablePrice', 'payPrice', 'collectionPrice', 'refundPrice', 'memberBuyCount'];
  1032. columns.forEach((column, index) => {
  1033. if (index === 0) {
  1034. sums[index] = '总计';
  1035. return;
  1036. }
  1037. if (sumProps.includes(column.property)) {
  1038. const total = data.reduce((sum, row) => {
  1039. const v = Number(row[column.property]);
  1040. return isNaN(v) ? sum : sum + v;
  1041. }, 0);
  1042. sums[index] = column.property === 'memberBuyCount' ? total : total.toFixed(2);
  1043. } else {
  1044. sums[index] = '';
  1045. }
  1046. });
  1047. return sums;
  1048. },
  1049. getCompanyList() {
  1050. getCompanyList().then(response => {
  1051. this.companyList = response.data || [];
  1052. });
  1053. },
  1054. /** 查询部门下拉树结构 */
  1055. getTreeselect() {
  1056. treeselect().then((response) => {
  1057. this.deptOptions = response.data;
  1058. });
  1059. },
  1060. handleCreateTimeChange(val) {
  1061. if (val) {
  1062. this.queryParams.sTime = val[0];
  1063. this.queryParams.eTime = val[1];
  1064. } else {
  1065. this.queryParams.sTime = null;
  1066. this.queryParams.eTime = null;
  1067. }
  1068. },
  1069. handleDeliveryTimeChange(val) {
  1070. if (val) {
  1071. this.queryParams.deliveryStartTime = val[0];
  1072. this.queryParams.deliveryEndTime = val[1];
  1073. } else {
  1074. this.queryParams.deliveryStartTime = null;
  1075. this.queryParams.deliveryEndTime = null;
  1076. }
  1077. },
  1078. handleDepositReturnTimeChange(val) {
  1079. if (val) {
  1080. this.queryParams.depositReturnTimeStart = val[0];
  1081. this.queryParams.depositReturnTimeEnd = val[1];
  1082. } else {
  1083. this.queryParams.depositReturnTimeStart = null;
  1084. this.queryParams.depositReturnTimeEnd = null;
  1085. }
  1086. },
  1087. handleFollowTimeChange(val) {
  1088. if (val) {
  1089. this.queryParams.followTimeStart = val[0];
  1090. this.queryParams.followTimeEnd = val[1];
  1091. } else {
  1092. this.queryParams.followTimeStart = null;
  1093. this.queryParams.followTimeEnd = null;
  1094. }
  1095. },
  1096. handleRefundTimeChange(val) {
  1097. if (val) {
  1098. this.queryParams.refundTimeStart = val[0];
  1099. this.queryParams.refundTimeEnd = val[1];
  1100. } else {
  1101. this.queryParams.refundTimeStart = null;
  1102. this.queryParams.refundTimeEnd = null;
  1103. }
  1104. },
  1105. handleAuditTimeChange(val) {
  1106. if (val) {
  1107. this.queryParams.auditTimeStart = val[0];
  1108. this.queryParams.auditTimeEnd = val[1];
  1109. } else {
  1110. this.queryParams.auditTimeStart = null;
  1111. this.queryParams.auditTimeEnd = null;
  1112. }
  1113. },
  1114. handleQuery() {
  1115. this.queryParams.pageNum = 1;
  1116. this.getList();
  1117. },
  1118. resetQuery() {
  1119. this.resetForm("queryForm");
  1120. this.createTime = null;
  1121. this.deliveryTime = null;
  1122. this.depositReturnTime = null;
  1123. this.followTime = null;
  1124. this.refundTime = null;
  1125. this.auditTime = null;
  1126. this.queryParams.sTime = null;
  1127. this.queryParams.eTime = null;
  1128. this.queryParams.deliveryStartTime = null;
  1129. this.queryParams.deliveryEndTime = null;
  1130. this.queryParams.depositReturnTimeStart = null;
  1131. this.queryParams.depositReturnTimeEnd = null;
  1132. this.queryParams.followTimeStart = null;
  1133. this.queryParams.followTimeEnd = null;
  1134. this.queryParams.refundTimeStart = null;
  1135. this.queryParams.refundTimeEnd = null;
  1136. this.queryParams.auditTimeStart = null;
  1137. this.queryParams.auditTimeEnd = null;
  1138. this.queryParams.rejectReturnTimeStart = null;
  1139. this.queryParams.rejectReturnTimeEnd = null;
  1140. // 清空列头筛选选中状态及对应查询参数
  1141. this.resetColumnFilters();
  1142. this.handleQuery();
  1143. },
  1144. handleAdd() {
  1145. this.reset();
  1146. this.phone = null;
  1147. this.users = [];
  1148. this.address = [];
  1149. this.drugList = [];
  1150. this.selectedStoreId = null;
  1151. this.storeOptions = [];
  1152. this.loadStoreList();
  1153. this.open = true;
  1154. this.title = "创建外部订单";
  1155. },
  1156. reset() {
  1157. this.form = {
  1158. addressId: null,
  1159. userId: null,
  1160. receiverPhone: null,
  1161. payType: null,
  1162. totalPrice: null,
  1163. payMoney: null,
  1164. products: []
  1165. };
  1166. this.drugList = [];
  1167. this.selectedStoreId = null;
  1168. this.resetForm("form");
  1169. },
  1170. cancel() {
  1171. this.open = false;
  1172. this.reset();
  1173. },
  1174. searchUser() {
  1175. if (this.phone == null || this.phone == "") {
  1176. this.msgError("请输入会员手机号");
  1177. return;
  1178. }
  1179. var data = { phone: this.phone };
  1180. this.userloading = true;
  1181. this.users = [];
  1182. this.address = [];
  1183. this.form.userId = null;
  1184. this.form.addressId = null;
  1185. request({
  1186. url: '/store/user/externalList',
  1187. method: 'get',
  1188. params: data
  1189. }).then(response => {
  1190. this.users = response.rows || [];
  1191. this.userloading = false;
  1192. if (this.users != null && this.users.length == 1) {
  1193. this.form.userId = this.users[0].userId;
  1194. this.getAddressList(this.form.userId);
  1195. }
  1196. }).catch(() => {
  1197. this.userloading = false;
  1198. });
  1199. },
  1200. handleAddUser() {
  1201. this.user.open = true;
  1202. },
  1203. handleUserChange(userId) {
  1204. this.form.addressId = null;
  1205. if (userId != null) {
  1206. this.getAddressList(userId);
  1207. } else {
  1208. this.address = [];
  1209. }
  1210. },
  1211. addUser(phone) {
  1212. this.user.open = false;
  1213. this.phone = phone;
  1214. this.searchUser();
  1215. },
  1216. handleAddUserAddress() {
  1217. if (this.form.userId == null) {
  1218. this.msgError("请选择会员");
  1219. return;
  1220. }
  1221. this.userAddress.open = true;
  1222. setTimeout(() => {
  1223. this.$refs.addExternalUserAddress.init(this.form.userId);
  1224. }, 500);
  1225. },
  1226. addUserAddress() {
  1227. this.userAddress.open = false;
  1228. this.getAddressList(this.form.userId);
  1229. },
  1230. getAddressList(userId) {
  1231. var data = { userId: userId };
  1232. this.addressloading = true;
  1233. this.address = [];
  1234. listUserAddress(data).then(response => {
  1235. this.address = response.rows;
  1236. this.addressloading = false;
  1237. });
  1238. },
  1239. handleAddProduct() {
  1240. if (!this.selectedStoreId) {
  1241. this.$message({ message: '请先选择店铺', type: 'warning' });
  1242. return;
  1243. }
  1244. this.productSearchKeyword = null;
  1245. this.productDialogPage.pageNum = 1;
  1246. this.getProductDialogList();
  1247. this.productDialogVisible = true;
  1248. },
  1249. searchProductDialog() {
  1250. this.productDialogPage.pageNum = 1;
  1251. this.getProductDialogList();
  1252. },
  1253. getProductDialogList() {
  1254. var data = {
  1255. pageNum: this.productDialogPage.pageNum,
  1256. pageSize: this.productDialogPage.pageSize,
  1257. productName: this.productSearchKeyword,
  1258. storeId: this.selectedStoreId
  1259. };
  1260. listStoreProduct(data).then(response => {
  1261. this.productDialogList = response.rows || [];
  1262. this.productDialogTotal = response.total || 0;
  1263. });
  1264. },
  1265. loadStoreList() {
  1266. listStore().then(response => {
  1267. this.storeOptions = response.rows || [];
  1268. });
  1269. },
  1270. handleStoreChange() {
  1271. this.drugList = [];
  1272. this.form.totalPrice = null;
  1273. },
  1274. selectProduct(row) {
  1275. for (var i = 0; i < this.drugList.length; i++) {
  1276. if (this.drugList[i].productId == row.productId) {
  1277. this.$message({ message: '该商品已添加', type: 'warning' });
  1278. return;
  1279. }
  1280. }
  1281. row.count = 1;
  1282. row.price = Number(row.price) || 0;
  1283. row.money = row.count * row.price;
  1284. this.drugList.push({ ...row });
  1285. this.compute();
  1286. this.$message({ message: '添加成功', type: 'success' });
  1287. },
  1288. handleProductDelete(row) {
  1289. this.drugList.splice(this.drugList.findIndex(item => item.productId === row.productId), 1);
  1290. this.compute();
  1291. },
  1292. handleProductCountChange(row) {
  1293. row.money = row.count * row.price;
  1294. this.$forceUpdate();
  1295. this.compute();
  1296. },
  1297. compute() {
  1298. var total = 0;
  1299. this.drugList.forEach(function(value) {
  1300. total += value.money;
  1301. });
  1302. this.form.totalPrice = total.toFixed(2);
  1303. },
  1304. submitForm() {
  1305. this.$refs["form"].validate(valid => {
  1306. if (valid) {
  1307. if (this.form.userId == null) {
  1308. this.msgError("请选择会员");
  1309. return;
  1310. }
  1311. if (this.drugList.length === 0) {
  1312. this.msgError("请添加至少一个商品");
  1313. return;
  1314. }
  1315. const products = this.drugList.map(item => ({
  1316. productId: item.productId,
  1317. num: item.count || 1,
  1318. price: item.price
  1319. }));
  1320. var submitData = {
  1321. addressId: this.form.addressId,
  1322. userId: this.form.userId,
  1323. payType: this.form.payType,
  1324. totalPrice: parseFloat(this.form.totalPrice) || 0,
  1325. payMoney: parseFloat(this.form.payMoney) || 0,
  1326. receiverPhone: this.form.receiverPhone,
  1327. products: products
  1328. };
  1329. createExternalOrder(submitData).then(response => {
  1330. if (response.code === 200) {
  1331. this.msgSuccess("创建成功");
  1332. this.open = false;
  1333. this.getList();
  1334. }
  1335. });
  1336. }
  1337. });
  1338. },
  1339. handleView(row) {
  1340. getExternalOrder(row.orderId).then(response => {
  1341. this.detailData = response.data;
  1342. this.detailOpen = true;
  1343. });
  1344. },
  1345. handleExpress(row) {
  1346. this.expressDialog.row = row;
  1347. this.expressDialog.open = true;
  1348. this.express = null;
  1349. this.traces = [];
  1350. getExternalOrderExpress(row.orderId).then(response => {
  1351. this.express = response.data;
  1352. if (this.express != null && this.express.Traces != null) {
  1353. this.traces = this.express.Traces;
  1354. }
  1355. });
  1356. },
  1357. handleSyncExpress(row) {
  1358. if (!row || !row.orderId) {
  1359. this.msgError("请选择订单");
  1360. return;
  1361. }
  1362. this.$confirm("确定同步物流状态吗?", "警告", {
  1363. confirmButtonText: "确定",
  1364. cancelButtonText: "取消",
  1365. type: "warning"
  1366. }).then(() => {
  1367. return syncExternalOrderExpress(row.orderId);
  1368. }).then(() => {
  1369. this.msgSuccess("操作成功");
  1370. this.expressDialog.open = false;
  1371. this.getList();
  1372. }).catch(function() {});
  1373. },
  1374. handleAudit(row) {
  1375. this.$confirm("确认审核该订单?审核后订单将变为审核通过状态", "提示", {
  1376. confirmButtonText: "确定",
  1377. cancelButtonText: "取消",
  1378. type: "warning"
  1379. }).then(() => {
  1380. auditExternalOrder(row.orderId).then(response => {
  1381. if (response.code === 200) {
  1382. this.msgSuccess("审核成功");
  1383. this.getList();
  1384. }
  1385. });
  1386. });
  1387. },
  1388. handleCancel(row) {
  1389. this.$confirm("确认取消该订单?取消后订单将变为已取消状态", "警告", {
  1390. confirmButtonText: "确定",
  1391. cancelButtonText: "取消",
  1392. type: "warning"
  1393. }).then(() => {
  1394. cancelExternalOrder(row.orderId).then(response => {
  1395. if (response.code === 200) {
  1396. this.msgSuccess("取消订单成功");
  1397. this.getList();
  1398. }
  1399. });
  1400. });
  1401. },
  1402. handleApprove(row) {
  1403. this.approveForm = {
  1404. orderIds: [row.orderId],
  1405. auditType: 1,
  1406. oldTotalPrice: row.payPrice,
  1407. newTotalPrice: null,
  1408. newPayPrice: null,
  1409. priceChangeReason: null,
  1410. voucherImages: null,
  1411. voucherRemark: null
  1412. };
  1413. this.approveOpen = true;
  1414. },
  1415. handleUploadSuccess(response) {
  1416. if (response.code === 200) {
  1417. this.approveForm.voucherImages = response.url;
  1418. this.msgSuccess("上传成功");
  1419. } else {
  1420. this.msgError(response.msg);
  1421. }
  1422. },
  1423. submitApprove() {
  1424. this.$refs["approveForm"].validate(valid => {
  1425. if (valid) {
  1426. const data = {
  1427. orderIds: this.approveForm.orderIds,
  1428. auditType: this.approveForm.auditType,
  1429. newTotalPrice: this.approveForm.newTotalPrice,
  1430. newPayPrice: this.approveForm.newPayPrice,
  1431. priceChangeReason: this.approveForm.priceChangeReason,
  1432. voucherImages: this.approveForm.voucherImages,
  1433. voucherRemark: this.approveForm.voucherRemark
  1434. };
  1435. approveExternalOrder(data).then(response => {
  1436. this.msgSuccess("提交成功");
  1437. this.approveOpen = false;
  1438. this.getList();
  1439. });
  1440. }
  1441. });
  1442. },
  1443. isAbnormalDelivery(deliveryType) {
  1444. if (deliveryType == null) return false;
  1445. const type = Number(deliveryType);
  1446. return type === 4 || (type >= 401 && type <= 423);
  1447. },
  1448. handleExport() {
  1449. const queryParams = this.queryParams;
  1450. this.$confirm("是否确认导出外部订单数据项?", "警告", {
  1451. confirmButtonText: "确定",
  1452. cancelButtonText: "取消",
  1453. type: "warning"
  1454. }).then(() => {
  1455. this.exportLoading = true;
  1456. return exportExternalOrder(queryParams);
  1457. }).then(response => {
  1458. this.download(response.msg);
  1459. this.exportLoading = false;
  1460. }).catch(() => {});
  1461. },
  1462. handleEdit(row) {
  1463. getExternalOrder(row.orderId).then(response => {
  1464. const d = response.data;
  1465. this.editForm = {
  1466. orderId: d.orderId,
  1467. status: d.status,
  1468. followTime: d.followTime || null,
  1469. deliveryName: d.deliveryName || null,
  1470. deliveryStatus: d.deliveryStatus != null ? d.deliveryStatus : null,
  1471. collectionPrice: d.collectionPrice != null ? Number(d.collectionPrice) : null,
  1472. updateTime: d.updateTime || null,
  1473. remark: d.remark || null,
  1474. deliveryCode: d.deliveryCode || null,
  1475. refundPrice: d.refundPrice != null ? Number(d.refundPrice) : null,
  1476. refundTime: d.refundTime || null,
  1477. rejectReturnTime: d.rejectReturnTime || null,
  1478. diseaseName: d.diseaseName || null,
  1479. isReturnGoods: d.isReturnGoods != null ? d.isReturnGoods : null
  1480. };
  1481. this.editOpen = true;
  1482. });
  1483. },
  1484. submitEditConfirm() {
  1485. this.editConfirmOpen = true;
  1486. },
  1487. submitEdit() {
  1488. editExternalOrder(this.editForm).then(response => {
  1489. if (response.code === 200) {
  1490. this.msgSuccess("修改成功");
  1491. this.editConfirmOpen = false;
  1492. this.editOpen = false;
  1493. this.getList();
  1494. }
  1495. });
  1496. }
  1497. }
  1498. };
  1499. </script>