index.vue 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. <template xmlns:el-col="http://www.w3.org/1999/html">
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="店铺名称" prop="storeName">
  5. <el-input
  6. v-model="queryParams.storeName"
  7. placeholder="请输入店铺名称"
  8. clearable
  9. size="small"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item label="地址" prop="address">
  14. <el-input
  15. v-model="queryParams.address"
  16. placeholder="请输入地址"
  17. clearable
  18. size="small"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item label="店铺电话" prop="phone">
  23. <el-input
  24. v-model="queryParams.phone"
  25. placeholder="请输入店铺电话"
  26. clearable
  27. size="small"
  28. @keyup.enter.native="handleQuery"
  29. />
  30. </el-form-item>
  31. <el-form-item label="状态" prop="status">
  32. <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
  33. <el-option
  34. v-for="dict in statusOptions"
  35. :key="dict.dictValue"
  36. :label="dict.dictLabel"
  37. :value="dict.dictValue"
  38. />
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="审核状态" prop="isAudit">
  42. <el-select v-model="queryParams.isAudit" placeholder="请选择审核状态" clearable size="small">
  43. <el-option
  44. v-for="dict in isAuditOptions"
  45. :key="dict.dictValue"
  46. :label="dict.dictLabel"
  47. :value="dict.dictValue"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="登录帐号" prop="account">
  52. <el-input
  53. v-model="queryParams.account"
  54. placeholder="请输入登录帐号"
  55. clearable
  56. size="small"
  57. @keyup.enter.native="handleQuery"
  58. />
  59. </el-form-item>
  60. <el-form-item>
  61. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  62. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  63. </el-form-item>
  64. </el-form>
  65. <el-row :gutter="10" class="mb8">
  66. <el-col :span="1.5">
  67. <el-button
  68. type="primary"
  69. plain
  70. icon="el-icon-plus"
  71. size="mini"
  72. @click="handleAdd"
  73. v-hasPermi="['store:his:store:add']"
  74. >新增</el-button>
  75. </el-col>
  76. <el-col :span="1.5">
  77. <el-button
  78. type="success"
  79. plain
  80. icon="el-icon-edit"
  81. size="mini"
  82. :disabled="single"
  83. @click="handleUpdate"
  84. v-hasPermi="['store:his:store:edit']"
  85. >修改</el-button>
  86. </el-col>
  87. <el-col :span="1.5">
  88. <el-button
  89. type="danger"
  90. plain
  91. icon="el-icon-delete"
  92. size="mini"
  93. :disabled="multiple"
  94. @click="handleDelete"
  95. v-hasPermi="['store:his:store:remove']"
  96. >删除</el-button>
  97. </el-col>
  98. <el-col :span="1.5">
  99. <el-button
  100. type="warning"
  101. plain
  102. icon="el-icon-download"
  103. size="mini"
  104. :loading="exportLoading"
  105. @click="handleExport"
  106. v-hasPermi="['store:his:store:export']"
  107. >导出</el-button>
  108. </el-col>
  109. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  110. </el-row>
  111. <el-table v-loading="loading" border :data="storeList" @selection-change="handleSelectionChange">
  112. <el-table-column type="selection" width="55" align="center" />
  113. <el-table-column label="店铺id" align="center" prop="storeId" width="120px"/>
  114. <el-table-column label="店铺名称" align="center" prop="storeName" width="120px"/>
  115. <el-table-column label="机构全称" align="center" prop="fullName" width="120px"/>
  116. <el-table-column label="店铺LOGO" align="center" prop="logoUrl" width="100px">
  117. <template slot-scope="scope">
  118. <el-popover
  119. placement="right"
  120. title=""
  121. trigger="hover">
  122. <img slot="reference" :src="scope.row.logoUrl" width="80px" height="80px">
  123. <img :src="scope.row.logoUrl" style="max-width: 160px;">
  124. </el-popover>
  125. </template>
  126. </el-table-column>
  127. <el-table-column label="地址" align="center" prop="address" width="200px"/>
  128. <el-table-column label="店铺电话" align="center" prop="phone" width="120px"/>
  129. <!-- <el-table-column label="资质证书" align="center" prop="licenseImages" width="100px">
  130. <template slot-scope="scope">
  131. <el-popover
  132. placement="right"
  133. title=""
  134. trigger="hover">
  135. <img slot="reference" :src="scope.row.licenseImages" width="80px">
  136. <img :src="scope.row.licenseImages" style="max-width: 150px;">
  137. </el-popover>
  138. </template>
  139. </el-table-column>
  140. <el-table-column label="营业执照" align="center" prop="bizLicense" width="100px">
  141. <template slot-scope="scope">
  142. <el-popover
  143. placement="right"
  144. title=""
  145. trigger="hover">
  146. <img slot="reference" :src="scope.row.bizLicense" width="80px">
  147. <img :src="scope.row.bizLicense" style="max-width: 150px;">
  148. </el-popover>
  149. </template>
  150. </el-table-column>-->
  151. <el-table-column label="审核状态" align="center" prop="isAudit">
  152. <template slot-scope="scope">
  153. <dict-tag :options="isAuditOptions" :value="scope.row.isAudit"/>
  154. </template>
  155. </el-table-column>
  156. <el-table-column label="商品总数" align="center" prop="productCount" />
  157. <el-table-column label="状态" align="center" prop="status">
  158. <template slot-scope="scope">
  159. <dict-tag :options="statusOptions" :value="scope.row.status"/>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="销量" align="center" prop="salesCount" />
  163. <el-table-column label="余额" align="center" prop="balance" />
  164. <el-table-column label="累计金额" align="center" prop="totalMoney" />
  165. <el-table-column label="登录帐号" align="center" prop="account" width="150px" />
  166. <el-table-column label="创建时间" align="center" prop="createTime" width="150px"/>
  167. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="150px">
  168. <template slot-scope="scope">
  169. <el-button
  170. size="mini"
  171. type="text"
  172. icon="el-icon-edit"
  173. @click="handleUpdate(scope.row)"
  174. v-hasPermi="['store:his:store:edit']"
  175. >修改</el-button>
  176. <el-button
  177. size="mini"
  178. type="text"
  179. icon="el-icon-s-promotion"
  180. @click="handledetails(scope.row)"
  181. v-hasPermi="['store:his:store:query']"
  182. >详情
  183. </el-button>
  184. <el-button
  185. size="mini"
  186. type="text"
  187. icon="el-icon-delete"
  188. @click="handleDelete(scope.row)"
  189. v-hasPermi="['store:his:store:remove']"
  190. >删除</el-button>
  191. <el-button
  192. size="mini"
  193. type="text"
  194. icon="el-icon-refresh"
  195. @click="handleRefresh(scope.row)"
  196. v-hasPermi="['store:his:store:refresh']"
  197. >重置密码</el-button>
  198. </template>
  199. </el-table-column>
  200. </el-table>
  201. <pagination
  202. v-show="total>0"
  203. :total="total"
  204. :page.sync="queryParams.pageNum"
  205. :limit.sync="queryParams.pageSize"
  206. @pagination="getList"
  207. />
  208. <!-- 添加或修改店铺管理对话框 -->
  209. <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
  210. <el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="top">
  211. <el-divider content-position="left">基础信息</el-divider>
  212. <el-row>
  213. <el-col :span="12">
  214. <el-form-item label="店铺名称" prop="storeName">
  215. <el-input v-model="form.storeName" placeholder="请输入店铺名称" />
  216. </el-form-item>
  217. </el-col>
  218. <el-col :span="12">
  219. <el-form-item label="电话" prop="phone">
  220. <el-input v-model="form.phone" placeholder="请输入店铺电话" />
  221. </el-form-item>
  222. </el-col>
  223. </el-row>
  224. <el-form-item label="企业全称" prop="fullName">
  225. <el-input v-model="form.fullName" placeholder="请输入企业全称" />
  226. </el-form-item>
  227. <el-row>
  228. <el-col :span="12">
  229. <el-form-item label="店铺LOGO" prop="logoUrl">
  230. <el-upload
  231. v-model="form.logoUrl"
  232. class="avatar-uploader"
  233. :action="uploadUrl"
  234. :show-file-list="false"
  235. :on-success="handleAvatarSuccess"
  236. :before-upload="beforeAvatarUpload">
  237. <img v-if="form.logoUrl" :src="form.logoUrl" class="avatar" width="200px">
  238. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  239. </el-upload>
  240. </el-form-item>
  241. </el-col >
  242. <el-col :span="12">
  243. </el-col>
  244. </el-row>
  245. <el-row>
  246. <el-col :span="24">
  247. <el-form-item label="店铺介绍" prop="descs" >
  248. <el-input v-model="form.descs" placeholder="请输入店铺介绍" type="textarea"/>
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. <el-row>
  253. <el-col :span="12">
  254. <el-form-item label="所属城市" prop="cityIds">
  255. <el-cascader
  256. ref="citySelect"
  257. v-model="form.cityIds"
  258. :options="citys"
  259. @change="handleCityChange">
  260. </el-cascader>
  261. </el-form-item>
  262. </el-col>
  263. <el-col :span="12">
  264. <el-form-item label="地址" prop="address">
  265. <el-input v-model="form.address" placeholder="请输入地址" />
  266. </el-form-item>
  267. </el-col>
  268. </el-row>
  269. <el-row>
  270. <el-col :span="12">
  271. <el-form-item label="法人姓名" prop="legalPersonName">
  272. <el-input v-model="form.legalPersonName" placeholder="请输入法人姓名" />
  273. </el-form-item>
  274. </el-col>
  275. <el-col :span="12">
  276. <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
  277. <el-input v-model="form.unifiedSocialCreditCode" placeholder="请输入统一社会信用代码" />
  278. </el-form-item>
  279. </el-col>
  280. </el-row>
  281. <el-form-item label="营业范围" prop="businessScope">
  282. <el-input v-model="form.businessScope" placeholder="请输入营业范围" type="textarea" />
  283. </el-form-item>
  284. <!-- 证书上传相关字段 -->
  285. <el-divider content-position="left">资质证书信息</el-divider>
  286. <el-row>
  287. <el-col :span="12">
  288. <el-form-item label="营业执照上传" prop="businessLicense">
  289. <el-upload
  290. class="avatar-uploader"
  291. :action="uploadUrl"
  292. :show-file-list="false"
  293. :on-success="(response, file) => handleFileSuccess(response, file, 'businessLicense')"
  294. :before-upload="beforeAvatarUpload">
  295. <img v-if="form.businessLicense" :src="form.businessLicense" class="avatar" width="100px">
  296. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  297. </el-upload>
  298. </el-form-item>
  299. </el-col>
  300. <el-col :span="12">
  301. <el-form-item label="营业执照失效日期" prop="businessLicenseExpire">
  302. <el-date-picker
  303. v-model="form.businessLicenseExpire"
  304. type="daterange"
  305. value-format="yyyy-MM-dd"
  306. range-separator="至"
  307. start-placeholder="开始日期"
  308. end-placeholder="结束日期">
  309. </el-date-picker>
  310. </el-form-item>
  311. </el-col>
  312. </el-row>
  313. <div v-if="this.$store.state.user.medicalMallConfig.medicalMall">
  314. <el-row>
  315. <el-col :span="12">
  316. <el-form-item label="药品经营许可证上传" prop="drugLicense">
  317. <el-upload
  318. class="avatar-uploader"
  319. :action="uploadUrl"
  320. :show-file-list="false"
  321. :on-success="(response, file) => handleFileSuccess(response, file, 'drugLicense')"
  322. :before-upload="beforeAvatarUpload">
  323. <img v-if="form.drugLicense" :src="form.drugLicense" class="avatar" width="100px">
  324. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  325. </el-upload>
  326. </el-form-item>
  327. </el-col>
  328. <el-col :span="12">
  329. <el-form-item label="药品经营许可证有效期" prop="drugLicenseExpiry">
  330. <el-date-picker
  331. v-model="form.drugLicenseExpiry"
  332. type="daterange"
  333. value-format="yyyy-MM-dd"
  334. range-separator="至"
  335. start-placeholder="开始日期"
  336. end-placeholder="结束日期">
  337. </el-date-picker>
  338. </el-form-item>
  339. </el-col>
  340. </el-row>
  341. <el-row>
  342. <el-col :span="12">
  343. <el-form-item label="1类器械生产备案上传" prop="medicalDevice1">
  344. <el-upload
  345. class="avatar-uploader"
  346. :action="uploadUrl"
  347. :show-file-list="false"
  348. :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice1')"
  349. :before-upload="beforeAvatarUpload">
  350. <img v-if="form.medicalDevice1" :src="form.medicalDevice1" class="avatar" width="100px">
  351. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  352. </el-upload>
  353. </el-form-item>
  354. </el-col>
  355. <el-col :span="12">
  356. <el-form-item label="1类生产备案有效期" prop="medicalDevice1Expiry">
  357. <el-date-picker
  358. v-model="form.medicalDevice1Expiry"
  359. type="daterange"
  360. value-format="yyyy-MM-dd"
  361. range-separator="至"
  362. start-placeholder="开始日期"
  363. end-placeholder="结束日期">
  364. </el-date-picker>
  365. </el-form-item>
  366. </el-col>
  367. </el-row>
  368. <el-row>
  369. <el-col :span="12">
  370. <el-form-item label="2类医疗器械备案证书上传" prop="medicalDevice2">
  371. <el-upload
  372. class="avatar-uploader"
  373. :action="uploadUrl"
  374. :show-file-list="false"
  375. :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice2')"
  376. :before-upload="beforeAvatarUpload">
  377. <img v-if="form.medicalDevice2" :src="form.medicalDevice2" class="avatar" width="100px">
  378. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  379. </el-upload>
  380. </el-form-item>
  381. </el-col>
  382. <el-col :span="12">
  383. <el-form-item label="2类医疗器械备案有效期" prop="medicalDevice2Expiry">
  384. <el-date-picker
  385. v-model="form.medicalDevice2Expiry"
  386. type="daterange"
  387. value-format="yyyy-MM-dd"
  388. range-separator="至"
  389. start-placeholder="开始日期"
  390. end-placeholder="结束日期">
  391. </el-date-picker>
  392. </el-form-item>
  393. </el-col>
  394. </el-row>
  395. <el-row>
  396. <el-col :span="12">
  397. <el-form-item label="3类器械经营许可证上传" prop="medicalDevice3">
  398. <el-upload
  399. class="avatar-uploader"
  400. :action="uploadUrl"
  401. :show-file-list="false"
  402. :on-success="(response, file) => handleFileSuccess(response, file, 'medicalDevice3')"
  403. :before-upload="beforeAvatarUpload">
  404. <img v-if="form.medicalDevice3" :src="form.medicalDevice3" class="avatar" width="100px">
  405. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  406. </el-upload>
  407. </el-form-item>
  408. </el-col>
  409. <el-col :span="12">
  410. <el-form-item label="3类器械经营许可证有效期" prop="medicalDevice3Expiry">
  411. <el-date-picker
  412. v-model="form.medicalDevice3Expiry"
  413. type="daterange"
  414. value-format="yyyy-MM-dd"
  415. range-separator="至"
  416. start-placeholder="开始日期"
  417. end-placeholder="结束日期">
  418. </el-date-picker>
  419. </el-form-item>
  420. </el-col>
  421. </el-row>
  422. <el-row>
  423. <el-col :span="12">
  424. <el-form-item label="食品经营许可证上传" prop="foodLicense">
  425. <el-upload
  426. class="avatar-uploader"
  427. :action="uploadUrl"
  428. :show-file-list="false"
  429. :on-success="(response, file) => handleFileSuccess(response, file, 'foodLicense')"
  430. :before-upload="beforeAvatarUpload">
  431. <img v-if="form.foodLicense" :src="form.foodLicense" class="avatar" width="100px">
  432. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  433. </el-upload>
  434. </el-form-item>
  435. </el-col>
  436. <el-col :span="12">
  437. <el-form-item label="食品经营许可证有效期" prop="foodLicenseExpiry">
  438. <el-date-picker
  439. v-model="form.foodLicenseExpiry"
  440. type="daterange"
  441. value-format="yyyy-MM-dd"
  442. range-separator="至"
  443. start-placeholder="开始日期"
  444. end-placeholder="结束日期">
  445. </el-date-picker>
  446. </el-form-item>
  447. </el-col>
  448. </el-row>
  449. <el-row>
  450. <el-col :span="12">
  451. <el-form-item label="医疗机构执业许可证上传" prop="medicalLicense">
  452. <el-upload
  453. class="avatar-uploader"
  454. :action="uploadUrl"
  455. :show-file-list="false"
  456. :on-success="(response, file) => handleFileSuccess(response, file, 'medicalLicense')"
  457. :before-upload="beforeAvatarUpload">
  458. <img v-if="form.medicalLicense" :src="form.medicalLicense" class="avatar" width="100px">
  459. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  460. </el-upload>
  461. </el-form-item>
  462. </el-col>
  463. <el-col :span="12">
  464. <el-form-item label="医疗机构执业许可证有效期" prop="medicalLicenseExpiry">
  465. <el-date-picker
  466. v-model="form.medicalLicenseExpiry"
  467. type="daterange"
  468. value-format="yyyy-MM-dd"
  469. range-separator="至"
  470. start-placeholder="开始日期"
  471. end-placeholder="结束日期">
  472. </el-date-picker>
  473. </el-form-item>
  474. </el-col>
  475. </el-row>
  476. </div>
  477. <el-divider content-position="left">店铺配置信息</el-divider>
  478. <el-form-item label="退货地址" prop="refundAddress">
  479. <el-input v-model="form.refundAddress" placeholder="请输入退货地址" />
  480. </el-form-item>
  481. <el-row>
  482. <el-col :span="12">
  483. <el-form-item label="退货电话" prop="refundPhone">
  484. <el-input v-model="form.refundPhone" placeholder="请输入退货电话" />
  485. </el-form-item>
  486. </el-col>
  487. <el-col :span="12">
  488. <el-form-item label="退货收货人" prop="refundConsignee">
  489. <el-input v-model="form.refundConsignee" placeholder="请输入退货收货人" />
  490. </el-form-item>
  491. </el-col>
  492. </el-row>
  493. <el-form-item label="寄件人电话" prop="sendPhone">
  494. <el-input v-model="form.sendPhone" placeholder="请输入寄件人电话" />
  495. </el-form-item>
  496. <el-row>
  497. <el-col :span="12">
  498. <el-form-item label="商品总数" prop="productCount">
  499. <el-input-number v-model="form.productCount" :min="0" label="描述文字"></el-input-number>
  500. </el-form-item>
  501. </el-col>
  502. <el-col :span="12">
  503. <el-form-item label="销量" prop="salesCount">
  504. <el-input-number v-model="form.salesCount" :min="0" label="描述文字"></el-input-number>
  505. </el-form-item>
  506. </el-col>
  507. </el-row>
  508. <el-row>
  509. <el-col :span="12">
  510. <el-form-item label="累计金额" prop="totalMoney">
  511. <el-input-number v-model="form.totalMoney" :precision="2" :step="0.1"></el-input-number>
  512. </el-form-item>
  513. </el-col>
  514. <el-col :span="12">
  515. <!-- <el-form-item label="分佣比例%" prop="shippingType">
  516. <el-input-number v-model="form.brokerageRate" :min="0" :max="100"></el-input-number>
  517. </el-form-item> -->
  518. </el-col>
  519. </el-row>
  520. <el-row>
  521. <el-col :span="12">
  522. <el-form-item label="状态">
  523. <el-radio-group v-model="form.status">
  524. <el-radio
  525. v-for="dict in statusOptions"
  526. :key="dict.dictValue"
  527. :label="parseInt(dict.dictValue)"
  528. >{{dict.dictLabel}}</el-radio>
  529. </el-radio-group>
  530. </el-form-item>
  531. </el-col>
  532. <el-col :span="12">
  533. <el-form-item label="分佣方式" prop="brokerageType" >
  534. <el-radio v-model="form.brokerageType" label="1">每盒</el-radio>
  535. <el-radio v-model="form.brokerageType" label="2">总价</el-radio>
  536. </el-form-item>
  537. </el-col>
  538. </el-row>
  539. <el-form-item label="配送方式" prop="shippingType">
  540. <el-checkbox-group v-model="form.shippingType" size="medium">
  541. <el-checkbox v-for="(item, index) in shippingTypeOptions" :key="index" :label="item.value"
  542. :disabled="item.disabled">{{item.label}}</el-checkbox>
  543. </el-checkbox-group>
  544. </el-form-item>
  545. <el-divider content-position="left">登录信息</el-divider>
  546. <el-form-item label="登录帐号" prop="account" v-if="title != '修改店铺管理'">
  547. <el-input v-model="form.account" placeholder="请输入登录帐号" />
  548. </el-form-item>
  549. <!-- tips-->
  550. <span class="tip-text" v-if="title !== '修改店铺管理'">请及时修改密码,初试密码XyzAbc~12</span>
  551. </el-form>
  552. <div slot="footer" class="dialog-footer">
  553. <el-button type="primary" @click="submitForm">确 定</el-button>
  554. <el-button @click="cancel">取 消</el-button>
  555. </div>
  556. </el-dialog>
  557. <el-drawer
  558. :with-header="false"
  559. size="75%"
  560. :title="show.title" :visible.sync="show.open">
  561. <storeDetails ref="Details" />
  562. </el-drawer>
  563. </div>
  564. </template>
  565. <script>
  566. import { listStore, getStore, delStore, addStore, updateStore, exportStore, refreshPasWod } from '@/api/hisStore/store'
  567. import storeDetails from '../components/storeDetails.vue';
  568. import {getCitys} from "@/api/store/city";
  569. export default {
  570. name: "Store",
  571. components: { storeDetails },
  572. data() {
  573. return {
  574. show: {
  575. title: "店铺详情",
  576. open: false,
  577. },
  578. shippingType: [],
  579. citys: [],
  580. licenseuploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
  581. uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS",
  582. baseUrl: process.env.VUE_APP_BASE_API,
  583. shippingTypeOptions: [{
  584. "label": "配送",
  585. "value": "1"
  586. }, {
  587. "label": "自提",
  588. "value": "2"
  589. }, {
  590. "label": "配送自提",
  591. "value": "3"
  592. }],
  593. // 遮罩层
  594. loading: true,
  595. // 导出遮罩层
  596. exportLoading: false,
  597. // 选中数组
  598. ids: [],
  599. // 非单个禁用
  600. single: true,
  601. // 非多个禁用
  602. multiple: true,
  603. // 显示搜索条件
  604. showSearch: true,
  605. // 总条数
  606. total: 0,
  607. // 店铺管理表格数据
  608. storeList: [],
  609. // 弹出层标题
  610. title: "",
  611. // 是否显示弹出层
  612. open: false,
  613. // 状态字典
  614. statusOptions: [],
  615. // 审核状态字典
  616. isAuditOptions: [],
  617. deliveryTypeOptions: [],
  618. // 查询参数
  619. queryParams: {
  620. pageNum: 1,
  621. pageSize: 10,
  622. storeName: null,
  623. address: null,
  624. phone: null,
  625. status: null,
  626. isAudit: null,
  627. account: null,
  628. },
  629. // 表单参数
  630. form: {},
  631. // 表单校验
  632. rules: {
  633. storeName: [
  634. { required: true, message: "店铺名称不能为空", trigger: "blur" }
  635. ],
  636. fullName: [
  637. { required: true, message: "店铺名称不能为空", trigger: "blur" }
  638. ],
  639. businessLicenseExpire: [
  640. { required: true, message: "营业执照失效日期不能为空", trigger: "blur" }
  641. ],
  642. businessLicense: [
  643. { required: true, message: "营业执照不能为空", trigger: "blur" }
  644. ],
  645. logoUrl: [
  646. { required: true, message: "店铺LOGO不能为空", trigger: "blur" }
  647. ],
  648. cityIds: [
  649. { required: true, message: "所属城市不能为空", trigger: "blur" }
  650. ],
  651. address: [
  652. { required: true, message: "地址不能为空", trigger: "blur" }
  653. ],
  654. licenseImages: [
  655. { required: true, message: "资质证书不能为空", trigger: "blur" }
  656. ],
  657. shippingType: [
  658. { required: true, message: "配送方式不能为空", trigger: "blur" }
  659. ],
  660. account: [
  661. { required: true, message: "登录账号不能为空", trigger: "blur" }
  662. ],
  663. brokerageType: [
  664. { required: true, message: "分佣方式不能为空", trigger: "blur" }
  665. ],
  666. refundPhone: [
  667. { required: true, message: "退货电话不能为空", trigger: "blur" }
  668. ],
  669. refundAddress: [
  670. { required: true, message: "退货地址不能为空", trigger: "blur" }
  671. ],
  672. refundConsignee: [
  673. { required: true, message: "退货收货人不能为空", trigger: "blur" }
  674. ],
  675. sendPhone: [
  676. { required: true, message: "寄件人电话不能为空", trigger: "blur" },
  677. ],
  678. phone: [
  679. {
  680. pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
  681. message: "请输入正确的手机号码",
  682. trigger: "blur",
  683. required: true
  684. }
  685. ],
  686. // 新增字段校验规则
  687. enterpriseShortName: [
  688. { required: true, message: "企业简称不能为空", trigger: "blur" }
  689. ],
  690. enterpriseFullName: [
  691. { required: true, message: "企业全称不能为空", trigger: "blur" }
  692. ],
  693. contactPhone: [
  694. { required: true, message: "电话号码不能为空", trigger: "blur" }
  695. ],
  696. enterpriseAddress: [
  697. { required: true, message: "企业地址不能为空", trigger: "blur" }
  698. ],
  699. legalPersonName: [
  700. { required: true, message: "法人姓名不能为空", trigger: "blur" }
  701. ],
  702. unifiedSocialCreditCode: [
  703. { required: true, message: "统一社会信用代码不能为空", trigger: "blur" }
  704. ],
  705. businessScope: [
  706. { required: true, message: "营业范围不能为空", trigger: "blur" }
  707. ],
  708. password: [
  709. { required: true, message: "新密码不能为空", trigger: "blur" },
  710. { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
  711. ],
  712. }
  713. };
  714. },
  715. created() {
  716. this.getCitys();
  717. this.getList();
  718. this.getDicts("sys_company_status").then(response => {
  719. this.statusOptions = response.data;
  720. });
  721. this.getDicts("sys_company_isaudit").then(response => {
  722. this.isAuditOptions = response.data;
  723. });
  724. this.getDicts("sys_store_delivery_type").then(response => {
  725. this.deliveryTypeOptions = response.data;
  726. });
  727. },
  728. methods: {
  729. handledetails(row) {
  730. this.show.open = true;
  731. setTimeout(() => {
  732. this.$refs.Details.getDetails(row.storeId,0);
  733. }, 1);
  734. },
  735. handleCityChange(value) {
  736. var nodes = this.$refs.citySelect.getCheckedNodes();
  737. this.form.address = nodes[0].pathLabels[0] + nodes[0].pathLabels[1] + nodes[0].pathLabels[2];
  738. this.form.cityIds = value.toString();
  739. },
  740. getCitys() {
  741. getCitys().then(res => {
  742. this.loading = false;
  743. this.citys = res.data;
  744. })
  745. },
  746. licensehandleAvatarSuccess(res, file) {
  747. if (res.code === 200) {
  748. this.form.licenseImages = res.url;
  749. this.$forceUpdate()
  750. } else {
  751. this.msgError(res.msg);
  752. }
  753. },
  754. handleAvatarSuccess(res, file) {
  755. if (res.code === 200) {
  756. this.form.logoUrl = res.url;
  757. this.$forceUpdate()
  758. } else {
  759. this.msgError(res.msg);
  760. }
  761. },
  762. beforeAvatarUpload(file) {
  763. const isLt1M = file.size / 1024 / 1024 < 1;
  764. if (!isLt1M) {
  765. this.$message.error('上传图片大小不能超过 1MB!');
  766. }
  767. return isLt1M;
  768. },
  769. handleBizLicenseSuccess(res, file) {
  770. if (res.code === 200) {
  771. this.form.bizLicense = res.url;
  772. this.$forceUpdate()
  773. } else {
  774. this.msgError(res.msg);
  775. }
  776. },
  777. beforeBizLicenseUpload(file) {
  778. const isLt1M = file.size / 1024 / 1024 < 5;
  779. if (!isLt1M) {
  780. this.$message.error('上传图片大小不能超过 5MB!');
  781. }
  782. return isLt1M;
  783. },
  784. // 通用文件上传成功处理函数
  785. handleFileSuccess(response, file, field) {
  786. if (response.code === 200) {
  787. this.$set(this.form, field, response.url);
  788. this.$forceUpdate();
  789. } else {
  790. this.msgError(response.msg);
  791. }
  792. },
  793. /** 查询店铺管理列表 */
  794. getList() {
  795. this.loading = true;
  796. listStore(this.queryParams).then(response => {
  797. this.storeList = response.rows;
  798. this.total = response.total;
  799. this.loading = false;
  800. });
  801. },
  802. // 取消按钮
  803. cancel() {
  804. this.open = false;
  805. this.reset();
  806. },
  807. // 表单重置
  808. reset() {
  809. this.form = {
  810. storeId: null,
  811. cityIds: null,
  812. storeName: null,
  813. descs: null,
  814. logoUrl: null,
  815. address: null,
  816. lng: null,
  817. lat: null,
  818. phone: null,
  819. licenseImages: null,
  820. productCount: null,
  821. status: 0,
  822. createTime: null,
  823. updateTime: null,
  824. salesCount: null,
  825. balance: null,
  826. totalMoney: null,
  827. isAudit: 0,
  828. account: null,
  829. password: null,
  830. shippingType: ["1"],
  831. brokerageType: "1",
  832. brokerageRate: 0,
  833. fullName: null,
  834. // 重置新增字段
  835. enterpriseShortName: null, // 企业简称
  836. enterpriseFullName: null, // 企业全称
  837. contactPhone: null, // 联系电话
  838. enterpriseAddress: null, // 企业地址
  839. legalPersonName: null, // 法人姓名
  840. unifiedSocialCreditCode: null, // 统一社会信用代码
  841. businessScope: null, // 营业范围
  842. // 重置证书相关字段
  843. businessLicense: null, // 营业执照文件
  844. businessLicenseExpire: null, // 营业执照失效日期
  845. drugLicense: null, // 药品经营许可证有效期
  846. drugLicenseExpiry: null, // 药品经营许可证文件
  847. // 医疗器械相关证书
  848. medicalDevice1: null, // 一类医疗器械备案证书
  849. medicalDevice1Expiry: null, // 二类医疗器械备案有效期
  850. medicalDevice2: null, // 二类器械生产备案文件
  851. medicalDevice2Expiry: null, // 一类生产备案有效期
  852. medicalDevice3: null, // 三类器械经营许可证文件
  853. medicalDevice3Expiry: null, // 三类器械经营许可证有效期
  854. // 其他许可证相关字段
  855. foodLicense: null, // 食品经营许可证文件
  856. foodLicenseExpiry: null, // 食品经营许可证有效期
  857. medicalLicense: null, // 医疗机构执业许可证文件
  858. medicalLicenseExpiry: null // 医疗机构执业许可证有效期
  859. };
  860. this.resetForm("form");
  861. },
  862. /** 搜索按钮操作 */
  863. handleQuery() {
  864. this.queryParams.pageNum = 1;
  865. this.getList();
  866. },
  867. /** 重置按钮操作 */
  868. resetQuery() {
  869. this.resetForm("queryForm");
  870. this.handleQuery();
  871. },
  872. // 多选框选中数据
  873. handleSelectionChange(selection) {
  874. this.ids = selection.map(item => item.storeId)
  875. this.single = selection.length !== 1
  876. this.multiple = !selection.length
  877. },
  878. /** 新增按钮操作 */
  879. handleAdd() {
  880. this.reset();
  881. this.open = true;
  882. this.title = "添加店铺";
  883. },
  884. /** 修改按钮操作 */
  885. handleUpdate(row) {
  886. this.reset();
  887. const storeId = row.storeId || this.ids
  888. getStore(storeId).then(response => {
  889. this.form = response.data;
  890. this.open = true;
  891. this.title = "修改店铺";
  892. // 移除 phone 字段的验证规则
  893. const newRules = Object.assign({}, this.rules);
  894. delete newRules.phone;
  895. this.rules = newRules;
  896. let str = this.form.shippingType
  897. this.form.shippingType = str.split(",")
  898. this.form.cityIds = ((this.form.cityIds).split(",")).map(Number)
  899. if (this.form.brokerageType != null) {
  900. this.form.brokerageType = JSON.stringify(this.form.brokerageType)
  901. }
  902. if (this.form.deliveryType != null) {
  903. this.form.deliveryType = JSON.stringify(this.form.deliveryType)
  904. }
  905. // 处理日期范围字段
  906. if (this.form.drugLicenseExpiryStart && this.form.drugLicenseExpiryEnd) {
  907. this.form.drugLicenseExpiry = [
  908. this.form.drugLicenseExpiryStart,
  909. this.form.drugLicenseExpiryEnd
  910. ];
  911. }
  912. if (this.form.medicalDevice1ExpiryStart && this.form.medicalDevice1ExpiryEnd) {
  913. this.form.medicalDevice1Expiry = [
  914. this.form.medicalDevice1ExpiryStart,
  915. this.form.medicalDevice1ExpiryEnd
  916. ];
  917. }
  918. if (this.form.medicalDevice2ExpiryStart && this.form.medicalDevice2ExpiryEnd) {
  919. this.form.medicalDevice2Expiry = [
  920. this.form.medicalDevice2ExpiryStart,
  921. this.form.medicalDevice2ExpiryEnd
  922. ];
  923. }
  924. if (this.form.medicalDevice3ExpiryStart && this.form.medicalDevice3ExpiryEnd) {
  925. this.form.medicalDevice3Expiry = [
  926. this.form.medicalDevice3ExpiryStart,
  927. this.form.medicalDevice3ExpiryEnd
  928. ];
  929. }
  930. if (this.form.foodLicenseExpiryStart && this.form.foodLicenseExpiryEnd) {
  931. this.form.foodLicenseExpiry = [
  932. this.form.foodLicenseExpiryStart,
  933. this.form.foodLicenseExpiryEnd
  934. ];
  935. }
  936. if (this.form.medicalLicenseExpiryStart && this.form.medicalLicenseExpiryEnd) {
  937. this.form.medicalLicenseExpiry = [
  938. this.form.medicalLicenseExpiryStart,
  939. this.form.medicalLicenseExpiryEnd
  940. ];
  941. }
  942. if (this.form.businessLicenseExpireStart && this.form.businessLicenseExpireEnd) {
  943. this.form.businessLicenseExpire = [
  944. this.form.businessLicenseExpireStart,
  945. this.form.businessLicenseExpireEnd
  946. ];
  947. }
  948. });
  949. },
  950. /** 提交按钮 */
  951. submitForm() {
  952. this.$refs["form"].validate(valid => {
  953. if (valid) {
  954. // 处理表单数据
  955. const formData = Object.assign({}, this.form);
  956. // 处理城市ID
  957. if (formData.cityIds) {
  958. formData.cityIds = formData.cityIds.toString();
  959. }
  960. // 处理配送方式
  961. if (formData.shippingType) {
  962. formData.shippingType = formData.shippingType.toString();
  963. }
  964. // 处理日期范围字段
  965. if (formData.drugLicenseExpiry && formData.drugLicenseExpiry.length === 2) {
  966. formData.drugLicenseExpiryStart = formData.drugLicenseExpiry[0];
  967. formData.drugLicenseExpiryEnd = formData.drugLicenseExpiry[1];
  968. }
  969. if (formData.medicalDevice2Expiry && formData.medicalDevice2Expiry.length === 2) {
  970. formData.medicalDevice2ExpiryStart = formData.medicalDevice2Expiry[0];
  971. formData.medicalDevice2ExpiryEnd = formData.medicalDevice2Expiry[1];
  972. }
  973. if (formData.medicalDevice1Expiry && formData.medicalDevice1Expiry.length === 2) {
  974. formData.medicalDevice1ExpiryStart = formData.medicalDevice1Expiry[0];
  975. formData.medicalDevice1ExpiryEnd = formData.medicalDevice1Expiry[1];
  976. }
  977. if (formData.medicalDevice3Expiry && formData.medicalDevice3Expiry.length === 2) {
  978. formData.medicalDevice3ExpiryStart = formData.medicalDevice3Expiry[0];
  979. formData.medicalDevice3ExpiryEnd = formData.medicalDevice3Expiry[1];
  980. }
  981. if (formData.foodLicenseExpiry && formData.foodLicenseExpiry.length === 2) {
  982. formData.foodLicenseExpiryStart = formData.foodLicenseExpiry[0];
  983. formData.foodLicenseExpiryEnd = formData.foodLicenseExpiry[1];
  984. }
  985. if (formData.medicalLicenseExpiry && formData.medicalLicenseExpiry.length === 2) {
  986. formData.medicalLicenseExpiryStart = formData.medicalLicenseExpiry[0];
  987. formData.medicalLicenseExpiryEnd = formData.medicalLicenseExpiry[1];
  988. }
  989. if (formData.businessLicenseExpire && formData.businessLicenseExpire.length === 2) {
  990. formData.businessLicenseExpireStart = formData.businessLicenseExpire[0];
  991. formData.businessLicenseExpireEnd = formData.businessLicenseExpire[1];
  992. }
  993. if (formData.storeId != null) {
  994. updateStore(formData).then(response => {
  995. this.msgSuccess("修改成功");
  996. this.open = false;
  997. this.getList();
  998. });
  999. } else {
  1000. addStore(formData).then(response => {
  1001. this.msgSuccess("新增成功");
  1002. this.open = false;
  1003. this.getList();
  1004. });
  1005. }
  1006. }
  1007. });
  1008. },
  1009. /** 删除按钮操作 */
  1010. handleDelete(row) {
  1011. const storeIds = row.storeId || this.ids;
  1012. this.$confirm('是否确认删除店铺管理编号为"' + storeIds + '"的数据项?', "警告", {
  1013. confirmButtonText: "确定",
  1014. cancelButtonText: "取消",
  1015. type: "warning"
  1016. }).then(function() {
  1017. return delStore(storeIds);
  1018. }).then(() => {
  1019. this.getList();
  1020. this.msgSuccess("删除成功");
  1021. }).catch(() => {
  1022. });
  1023. },
  1024. handleRefresh(row) {
  1025. const storeIds = row.storeId || this.ids;
  1026. this.$confirm('是否确认重置店铺管理编号为"' + storeIds + '"的密码为XyzAbc~12 ', "警告", {
  1027. confirmButtonText: "确定",
  1028. cancelButtonText: "取消",
  1029. type: "warning"
  1030. }).then(function() {
  1031. return refreshPasWod(storeIds);
  1032. }).then(() => {
  1033. this.getList();
  1034. this.msgSuccess("修改成功");
  1035. }).catch(() => {
  1036. });
  1037. },
  1038. /** 导出按钮操作 */
  1039. handleExport() {
  1040. const queryParams = this.queryParams;
  1041. this.$confirm('是否确认导出所有店铺管理数据项?', "警告", {
  1042. confirmButtonText: "确定",
  1043. cancelButtonText: "取消",
  1044. type: "warning"
  1045. }).then(() => {
  1046. this.exportLoading = true;
  1047. return exportStore(queryParams);
  1048. }).then(response => {
  1049. this.download(response.msg);
  1050. this.exportLoading = false;
  1051. }).catch(() => {
  1052. });
  1053. }
  1054. }
  1055. };
  1056. </script>
  1057. <style>
  1058. .avatar-uploader .el-upload {
  1059. border: 1px dashed #d9d9d9;
  1060. border-radius: 6px;
  1061. cursor: pointer;
  1062. position: relative;
  1063. overflow: hidden;
  1064. }
  1065. .avatar-uploader .el-upload:hover {
  1066. border-color: #409EFF;
  1067. }
  1068. .avatar-uploader-icon {
  1069. font-size: 28px;
  1070. color: #8c939d;
  1071. width: 150px;
  1072. height: 150px;
  1073. line-height: 150px;
  1074. text-align: center;
  1075. }
  1076. .el-divider__text {
  1077. font-size: 16px;
  1078. font-weight: bold;
  1079. }
  1080. </style>