index.vue 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. <template>
  2. <div v-loading="loading">
  3. <div class="white-box">
  4. <div class="filter-box">
  5. <filter-user :filter-types="filterTypes" @select-value="handleFilterUser"></filter-user>
  6. </div>
  7. <el-table class="table-box" ref="multipleTable" :data="tableData" stripe style="width: 100%;" :height="tool.getTableHeight()" @selection-change="handleSelectionChange">
  8. <el-table-column type="selection" width="55" v-if="tableHeaders" :selectable="checkSelectable"></el-table-column>
  9. <el-table-column v-for="(tableHeader, key) in tableHeaders" :key="key" :label="tableHeader.header" :width="tableHeader.other.width ? tableHeader.other.width : ''" :prop="tableHeader.other.prop ? tableHeader.other.prop : null">
  10. <template slot-scope="scope">
  11. <template v-if="scope.row[tableHeader.index].other.tag" >
  12. <el-tag :type="scope.row[tableHeader.index].other.tag.type ? scope.row[tableHeader.index].other.tag.type : null" :size="scope.row[tableHeader.index].other.tag.size ? scope.row[tableHeader.index].other.tag.size : null" :class="scope.row[tableHeader.index].other.tag.class ? scope.row[tableHeader.index].other.tag.class : null" >{{scope.row[tableHeader.index].value}}</el-tag>
  13. </template>
  14. <template v-else>
  15. <div v-html="scope.row[tableHeader.index].value"></div>
  16. </template>
  17. </template>
  18. </el-table-column>
  19. <el-table-column :fixed="fixedColumn" :label="$t('common.action')" width="180"><!-- 操作 -->
  20. <template slot-scope="scope">
  21. <el-dropdown size="small" trigger="click" v-if="permission.hasPermission(`shop/goods-edit`) || permission.hasPermission(`shop/goods-delete`)">
  22. <el-button type="primary" size="small" @click.stop="">
  23. {{ $t('common.action') }}<!-- 操作该数据 --><i class="el-icon-arrow-down el-icon--right"></i>
  24. </el-button>
  25. <el-dropdown-menu slot="dropdown">
  26. <el-dropdown-item command="goods-edit" @click.native="handleEditShow(scope.row)">{{ $t('common.edit') }}<!-- 修改数据 --> </el-dropdown-item>
  27. <el-dropdown-item command="del" @click.native="handleDel(scope.row.ID)" v-show="permission.hasPermission(`shop/goods-delete`)">
  28. {{ $t('common.delete') }}<!-- 删除数据 -->
  29. </el-dropdown-item>
  30. <el-dropdown-item command="goods-edit" @click.native="handleGoodUp(scope.row.ID)">{{ $t('shop.onSale') }}<!-- 商品上架 --> </el-dropdown-item>
  31. <el-dropdown-item command="goods-edit" @click.native="handleGoodDown(scope.row.ID)">{{ $t('shop.soldOut') }}<!-- 商品下架 --> </el-dropdown-item>
  32. </el-dropdown-menu>
  33. </el-dropdown>
  34. </template>
  35. </el-table-column>
  36. <!-- <el-table-column label="操作">
  37. <template slot-scope="scope">
  38. <el-button type="success" size="small" @click="handleGroupManage(scope.row)" >
  39. 状态管理
  40. </el-button>
  41. </template></el-table-column>-->
  42. </el-table>
  43. <div class="white-box-footer">
  44. <!-- <el-dropdown size="small" trigger="click">
  45. <el-button type="primary" size="small">
  46. 所选数据<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>
  47. </el-button>
  48. <el-dropdown-menu slot="dropdown">
  49. <el-dropdown-item command="delete" @click.native="handleMuliDel()">上架</el-dropdown-item>
  50. </el-dropdown-menu>
  51. </el-dropdown>-->
  52. <el-button type="primary" size="small" @click="handlestate" icon="el-icon-plus" v-if="permission.hasPermission(`shop/goods-add`)">
  53. <!-- 商品添加 -->{{ $t('shop.addProduct') }}
  54. </el-button>
  55. <el-button type="success" size="small" @click="handleExport" v-show="permission.hasPermission(`shop/goods-list-export`)">{{ $t('common.exportExcel') }}</el-button>
  56. <!-- <el-button-group>
  57. <el-button type="success" size="mini" @click.native="handleup(scope.row.ID)">上架</el-button>
  58. <el-button type="danger" size="mini">下架</el-button>
  59. </el-button-group> -->
  60. <pagination :total="totalCount" :page_size="pageSize" @size-change="handleSizeChange" @current-change="handleCurrentChange"></pagination>
  61. </div>
  62. </div>
  63. <el-dialog :title="$t('shop.editProducts')" :visible.sync="dialogEditFormVisible"><!-- 修改商品 -->
  64. <el-form :model="form" v-loading="dialogEditLoading" label-width="130px" :label-position="labelPosition">
  65. <el-form-item :label="$t('shop.productName')"><!-- 商品名称 -->
  66. <el-input v-model="form.goodsName"></el-input>
  67. </el-form-item>
  68. <!-- <el-form-item label="商品来源">
  69. <el-select v-model="form.type">
  70. <el-option v-for="(item,index) in goodsType" :key="index" :label="item.name"
  71. :value="index"></el-option>
  72. </el-select>
  73. </el-form-item> -->
  74. <el-form-item :label="$t('shop.memberDiscount')"><!-- 会员折扣 -->
  75. <el-input v-model="form.sellDiscount"></el-input>
  76. </el-form-item>
  77. <el-form-item :label="$t('shop.productType')"><!-- 商品类型 -->
  78. <el-checkbox v-for="(value,index) in GiftTypeArr" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
  79. </el-form-item>
  80. <!-- <el-form-item label="复消购买方式">
  81. <el-checkbox v-for="(value,index) in sell_type" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
  82. </el-form-item> -->
  83. <el-form-item :label="$t('shop.bvSplit')">
  84. <!-- <el-checkbox v-model="form.pvSplit" :checked="form.pvSplit">Yes</el-checkbox>-->
  85. <el-select v-model="form.pvSplit" placeholder="">
  86. <el-option
  87. v-for="item in pvSplitOptions"
  88. :key="item.value"
  89. :label="item.label"
  90. :value="item.value">
  91. </el-option>
  92. </el-select>
  93. </el-form-item>
  94. <el-form-item :label="$t('shop.productCategory')"> <!-- 商品分类 -->
  95. <el-select v-model="form.categoryType">
  96. <el-option v-for="item in categoryType" :key="item.id" :label="item.name" :value="item.id" ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item :label="$t('shop.productCode')"><!-- 商品编号 -->
  100. <el-input v-model="form.goodsNo"></el-input>
  101. </el-form-item>
  102. <el-form-item :label="$t('shop.unit')"><!-- 单位 -->
  103. <el-input v-model="form.unit"></el-input>
  104. </el-form-item>
  105. <!-- <el-form-item :label="$t('shop.taxRate')">&lt;!&ndash; 税率 &ndash;&gt;-->
  106. <!-- <el-input v-model="form.taxRate">-->
  107. <!-- <template slot="append">%</template>-->
  108. <!-- </el-input>-->
  109. <!-- </el-form-item>-->
  110. <el-form-item :label="$t('shop.standardPrice')" p>
  111. <el-input v-model="form.sellPriceStandard" @input="sellPriceStandardInput"></el-input>
  112. </el-form-item>
  113. <!-- <el-form-item :label="$t('shop.salesPrice')" p>-->
  114. <!-- <el-input v-model="form.sellPrice"></el-input>-->
  115. <!-- </el-form-item>-->
  116. <!-- <el-form-item :label="$t('shop.marketPrice')">-->
  117. <!-- <el-input v-model="form.marketPrice"></el-input>-->
  118. <!-- </el-form-item>-->
  119. <el-form-item :label="$t('shop.priceBV')" v-show="pvDisabled"> <!-- 价格BV -->
  120. <el-input v-model="form.pricePv"></el-input>
  121. </el-form-item>
  122. <!-- <el-form-item label="Exchange points" v-show="false"> &lt;!&ndash; 兑换积分 &ndash;&gt;-->
  123. <!-- <el-input v-model="form.point"></el-input>-->
  124. <!-- </el-form-item>-->
  125. <el-form-item :label="$t('shop.availableCountries')"><!-- 可购买国家 -->
  126. <el-button type="primary" size="small" @click="editAvailableCountries">{{ $t('shop.modifyAvailableCountries') }}</el-button>
  127. </el-form-item>
  128. <el-form-item :label="$t('shop.AutoMaintenance')"> <!-- 自动分期 -->
  129. <el-switch
  130. v-model="form.autoMaintenance"
  131. active-color="#13ce66"
  132. inactive-color="#ff4949"
  133. active-value="1"
  134. inactive-value="0">
  135. </el-switch>
  136. </el-form-item>
  137. <el-form-item :label="$t('shop.inventory')"> <!-- 库存 -->
  138. <el-input v-model="form.storeNums"></el-input>
  139. </el-form-item>
  140. <el-form-item :label="$t('shop.productDetails')"><!-- 商品详情 -->
  141. <el-input
  142. type="textarea"
  143. :rows="2"
  144. :placeholder="$t('shop.enterContentNotice')"
  145. v-model="form.content">
  146. </el-input><!-- 请输入内容 -->
  147. </el-form-item>
  148. <el-form-item :label="$t('shop.order')"> <!-- 排序 -->
  149. <el-input v-model="form.sort"></el-input>
  150. </el-form-item>
  151. <el-form-item :label="$t('shop.uploadImages')"> <!-- 上传图片 -->
  152. <div class='up_load'>
  153. <Upload
  154. v-model="form.image"
  155. :request-route="'v1/shop/upload'"
  156. :default-image-url="form.cover"
  157. width="100%"
  158. height="260px"
  159. @on-success="upLoadSuccess"
  160. ></Upload>
  161. </div>
  162. </el-form-item>
  163. </el-form>
  164. <div slot="footer" class="dialog-footer">
  165. <el-button @click="dialogEditFormVisible = false">{{ $t('table.cancel') }}<!-- 取 消 --></el-button>
  166. <el-button type="primary" @click.native="handleEdit">{{ $t('table.edit') }}<!-- 修 改 --></el-button>
  167. </div>
  168. </el-dialog>
  169. <el-dialog :title="$t('shop.modifyAvailableCountries')" :visible.sync="editAvailableCountriesDialog" top="3%" width="60%"><!-- 修改可购买国家 -->
  170. <el-form ref="form" label-width="130px" class="">
  171. <el-form-item :label="$t('shop.productName')"><!-- 商品名称 -->
  172. <el-input v-model="form.goodsName" style="width: 90%" disabled></el-input>
  173. </el-form-item>
  174. <el-form-item :label="$t('transportationConfig.countryName')">
  175. <el-input
  176. v-model="searchQuery"
  177. placeholder=""
  178. style="width: 90%"
  179. @input="updateTableData"
  180. ></el-input>
  181. </el-form-item>
  182. </el-form>
  183. <el-form :model="availableCountriesTableForm" ref="availableCountriesTableForm" :rules="rules">
  184. <el-table v-show="!searchQuery" :data="availableCountriesTableForm.availableCountriesList" ref="multipleTableCountries" @selection-change="countriesSelectionChange" @select="selectOne" :selectable="isRowSelectable" stripe :header-cell-class-name="cellClass" height="500" style="width: 100%;">
  185. <el-table-column
  186. type="selection"
  187. width="55"
  188. :selectable="selectable"
  189. :show-select-all="false"
  190. >
  191. </el-table-column>
  192. <el-table-column prop="NAME" :label="$t('transportationConfig.countryName')" />
  193. <el-table-column prop="LOCAL_CURRENCY_NAME" :label="$t('exchangeRateConfig.currencyType')" />
  194. <el-table-column :label="$t('shop.salesPrice')" min-width="100px;">
  195. <template slot-scope="scope">
  196. <el-form-item :prop="`availableCountriesList.${scope.$index}.sellPrice`" >
  197. <el-input-number v-model="scope.row.sellPrice" :controls="false"></el-input-number>
  198. </el-form-item>
  199. </template>
  200. </el-table-column>
  201. <el-table-column :label="$t('shop.marketPrice')" min-width="100px;">
  202. <template slot-scope="scope">
  203. <el-form-item :prop="`availableCountriesList.${scope.$index}.marketPrice`" >
  204. <el-input-number v-model="scope.row.marketPrice" :precision="2" :min="0.01" :controls="false" clearable></el-input-number>
  205. </el-form-item>
  206. </template>
  207. </el-table-column>
  208. <el-table-column :label="$t('shop.taxRate')" min-width="100px;">
  209. <template slot-scope="scope">
  210. <el-form-item :prop="`availableCountriesList.${scope.$index}.taxRate`" >
  211. <div class="flexJfAc">
  212. <el-input-number v-model="scope.row.taxRate" :precision="2" :min="0.01" :controls="false"></el-input-number><span>%</span>
  213. </div>
  214. </el-form-item>
  215. </template>
  216. </el-table-column>
  217. </el-table>
  218. <el-table v-show="searchQuery" :data="availableCountriesTableForm.tempData" ref="multipleTableTemp" @row-click="handleRowClickTemp" @selection-change="handleSelectionChangeTemp" @select="selectOneTemp" :selectable="isRowSelectable" :header-cell-class-name="cellClass" stripe height="500" style="width: 100%;">
  219. <el-table-column
  220. type="selection"
  221. width="55"
  222. :selectable="selectable"
  223. :show-select-all="false"
  224. >
  225. </el-table-column>
  226. <el-table-column prop="NAME" :label="$t('transportationConfig.countryName')" />
  227. <el-table-column prop="LOCAL_CURRENCY_NAME" :label="$t('exchangeRateConfig.currencyType')" />
  228. <el-table-column :label="$t('shop.salesPrice')" min-width="100px;">
  229. <template slot-scope="scope">
  230. <el-form-item :prop="`tempData.${scope.$index}.sellPrice`" >
  231. <el-input-number v-model="scope.row.sellPrice" :controls="false" disabled></el-input-number>
  232. </el-form-item>
  233. </template>
  234. </el-table-column>
  235. <el-table-column :label="$t('shop.marketPrice')" min-width="100px;">
  236. <template slot-scope="scope">
  237. <el-form-item :prop="`tempData.${scope.$index}.marketPrice`">
  238. <el-input-number v-model="scope.row.marketPrice" :precision="2" :min="0" :controls="false" clearable></el-input-number>
  239. </el-form-item>
  240. </template>
  241. </el-table-column>
  242. <el-table-column :label="$t('shop.taxRate')" min-width="100px;">
  243. <template slot-scope="scope">
  244. <el-form-item :prop="`tempData.${scope.$index}.taxRate`" >
  245. <div class="flexJfAc">
  246. <el-input-number v-model="scope.row.taxRate" :precision="2" :step="0.1" :min="0" :controls="false"></el-input-number><span>%</span>
  247. </div>
  248. </el-form-item>
  249. </template>
  250. </el-table-column>
  251. </el-table>
  252. </el-form>
  253. <div slot="footer" class="dialog-footer">
  254. <el-button type="warning" size="mini" @click="editAvailableCountriesDialog = false">{{ $t('table.cancel') }}</el-button>
  255. <el-button type="primary" size="mini" @click="submitAvailableCountries">{{ $t('table.confirm') }}</el-button>
  256. </div>
  257. </el-dialog>
  258. </div>
  259. </template>
  260. <script>
  261. import {getOperatingSystem, getScreenWidth} from "@/utils"
  262. import tool from '@/utils/tool'
  263. import baseInfo from '@/utils/baseInfo'
  264. import FilterUser from '@/components/FilterUser'
  265. import permission from '@/utils/permission'
  266. import Pagination from '@/components/Pagination'
  267. import filterHelper from '@/utils/filterHelper'
  268. import { shopList, goodsListExport, updateGoodsStatus, goodsDelete, getGoodsDetail, editGoodsData } from '@/api/shop'
  269. import Upload from '@/components/Upload'
  270. export default {
  271. name: 'index',
  272. components: {FilterUser, Pagination, Upload},
  273. mounted () {
  274. this.getData()
  275. // this.$refs.up_load.successImageUrl='';
  276. // let system = getOperatingSystem()
  277. // if (system == "Android" || system == 'ios') {
  278. // this.fixedColumn = false
  279. // } else {
  280. // this.fixedColumn = 'right'
  281. // }
  282. this.fixedColumn = getScreenWidth() < 500 ? false : 'right'
  283. },
  284. data () {
  285. return {
  286. fixedColumn:false, // 固定,当手机端不固定,pc固定
  287. tableHeaders: null,
  288. tableData: null,
  289. loading: true,
  290. currentPage: 1,
  291. totalPages: 1,
  292. totalCount: 1,
  293. pageSize: 20,
  294. multipleSelection: [],
  295. tool: tool,
  296. permission: permission,
  297. baseDecLevels: baseInfo.decLevels(),
  298. baseEmpLevels: baseInfo.empLevels(),
  299. filterTypes: null,
  300. dialogVisible: false,
  301. dialogLoading: false,
  302. filterModel: {},
  303. value: [],
  304. selectedIds: '',
  305. dialogEditFormVisible: false,
  306. dialogEditLoading: false,
  307. pvSplitOptions: [
  308. {
  309. value: '0',
  310. label: this.$t('common.no')
  311. },
  312. {
  313. value: '1',
  314. label: this.$t('common.yes')
  315. }],
  316. form: {
  317. // sellType: [],
  318. goodsName: '',
  319. type: '',
  320. giftType: [],
  321. goodsNo: '',
  322. unit: '',
  323. marketPrice: '',
  324. sellPrice: '',
  325. sellPriceStandard: '',
  326. pricePv: '',
  327. point: '',
  328. storeNums: '',
  329. content: '',
  330. sort: '',
  331. discount: '',
  332. cover: '',
  333. textarea: '',
  334. sellDiscount: '',
  335. pvSplit: '',
  336. categoryType: '',
  337. sellType: 1,
  338. taxRate: 0,
  339. autoMaintenance: null,
  340. },
  341. submitButtonStat: false,
  342. goodsType: [],
  343. GiftTypeArr: [],
  344. sell_type: [],
  345. categoryType: [],
  346. img_show: true,
  347. pvDisabled: true,
  348. exchangeRate: baseInfo.exchangeRate(),
  349. labelPosition: getScreenWidth() >= 600 ? 'left' : 'top',
  350. editAvailableCountriesDialog: false,
  351. availableCountriesTableForm: {
  352. availableCountriesList: [],
  353. tempData:[],
  354. },
  355. multipleSelectionCountries: [],
  356. multipleSelectionTemp: [],
  357. rules: {},
  358. rulesTemp: {},
  359. searchQuery: '',
  360. selectionTempData: [],
  361. selectedIdsCountry: [], // 存储选中的项的 ID
  362. selectedIdsTemp: [],
  363. }
  364. },
  365. methods: {
  366. updateTableData() {
  367. let that = this;
  368. // if (!this.searchQuery) {
  369. // return this.availableCountriesTableForm.availableCountriesList;
  370. // }
  371. // 临时存储原始数据,保持搜索时不改变其他列的值
  372. const query = that.searchQuery.toLowerCase();
  373. // this.$refs.multipleTable.toggleRowSelection(JSON.parse(JSON.stringify(this.multipleSelection)),true)
  374. if (that.availableCountriesTableForm.tempData.length === 0) {
  375. // this.tempData = JSON.parse(JSON.stringify(this.availableCountriesTableForm.availableCountriesList));
  376. // this.selectionTempData = JSON.parse(JSON.stringify(this.multipleSelection));
  377. }
  378. // const query = this.searchQuery.toLowerCase();
  379. that.$nextTick(() => {
  380. // 在数据更新后,重新设置选中的项
  381. console.log(this.searchQuery === "")
  382. console.log(query)
  383. if(!that.searchQuery){
  384. console.log('no---')
  385. that.setSelectionTemp();
  386. } else {
  387. console.log('yes---')
  388. that.availableCountriesTableForm.tempData = that.availableCountriesTableForm.availableCountriesList.filter(row => {
  389. return row.NAME.toLowerCase().includes(query);
  390. });
  391. that.setSelection();
  392. }
  393. });
  394. // this.availableCountriesTableForm.availableCountriesList.forEach(row => {
  395. // if (row.NAME.toLowerCase().includes(query)) {
  396. // } else {
  397. // const originalRow = this.filteredData.find(item => item.NAME === row.NAME);
  398. // if (originalRow) {
  399. // if(originalRow.selected === true){
  400. // console.log('originalRow true')
  401. // }
  402. // row = originalRow;
  403. //
  404. // }
  405. // }
  406. // });
  407. // this.$refs.multipleTable.toggleRowSelection(this.selectionTempData)
  408. },
  409. setSelection() {
  410. // this.$refs.multipleTable.clearSelection();
  411. console.log('----00000')
  412. this.availableCountriesTableForm.tempData.forEach(row => {
  413. console.log('----1111')
  414. if (this.selectedIdsCountry.includes(row.ID)) {
  415. this.$nextTick(() => {
  416. this.$refs.multipleTableTemp.toggleRowSelection(row, true);
  417. });
  418. }
  419. });
  420. },
  421. setSelectionTemp() {
  422. // this.$refs.multipleTable.clearSelection();
  423. let selectedIds = JSON.parse(JSON.stringify(this.selectedIdsCountry))
  424. let selectedIdsTemp = JSON.parse(JSON.stringify(this.selectedIdsTemp))
  425. console.log('----2222')
  426. let list = selectedIds.concat(selectedIdsTemp)
  427. console.log("list=====+" + list)
  428. this.availableCountriesTableForm.availableCountriesList.forEach(row => {
  429. console.log('----3333')
  430. if (list.includes(row.ID)) {
  431. this.$refs.multipleTableCountries.toggleRowSelection(row, true);
  432. }
  433. });
  434. },
  435. handleRowClickTemp(row) {
  436. // 手动控制行点击时的选中状态
  437. // this.$refs.multipleTableTemp.toggleRowSelection(row,true);
  438. },
  439. handleSelectionChangeTemp(val) {
  440. this.multipleSelectionTemp = val;
  441. // 更新选中的项
  442. this.selectedIdsTemp = val.map(item => item.ID);
  443. this.updateRulesTemp();
  444. },
  445. updateRulesTemp() {
  446. this.rules = {}; // 重置规则
  447. this.multipleSelectionTemp.forEach((row, index) => {
  448. this.rules[`tempData.${this.availableCountriesTableForm.tempData.indexOf(row)}.taxRate`] = [
  449. { required: true, message: this.$t('shop.enterTaxRate'), trigger: 'blur' }
  450. ];
  451. });
  452. },
  453. // 隐藏表头中的全选框
  454. cellClass(row) {
  455. if (row.columnIndex === 0) {
  456. return 'disabledCheck'
  457. }
  458. },
  459. isRowSelectable(row, index) {
  460. return row.CURRENCY_PRODUCT_RATE == 0;
  461. },
  462. selectable(row, index) {
  463. return row.CURRENCY_PRODUCT_RATE !== 0;
  464. },
  465. sellPriceStandardInput(value){
  466. console.log(value)
  467. // this.form.nature = []
  468. this.toggleSelection(this.form.nature, 'input')
  469. },
  470. countriesSelectionChange(val) {
  471. this.multipleSelectionCountries = val;
  472. this.selectedIdsCountry = val.map(item => item.ID);
  473. this.updateRules();
  474. },
  475. updateRules() {
  476. this.rules = {}; // 重置规则
  477. this.multipleSelectionCountries.forEach((row, index) => {
  478. this.rules[`availableCountriesList.${this.availableCountriesTableForm.availableCountriesList.indexOf(row)}.taxRate`] = [
  479. { required: true, message: this.$t('shop.enterTaxRate'), trigger: 'blur' }
  480. ];
  481. });
  482. },
  483. selectOne(selection,row){
  484. row.sellPrice = (row.CURRENCY_PRODUCT_RATE * this.form.sellPriceStandard).toFixed(2)
  485. row.marketPrice = (row.sellPrice * 1.2).toFixed(2)
  486. },
  487. selectOneTemp(selection,row){
  488. console.log(row.CURRENCY_PRODUCT_RATE)
  489. // if(!row.CURRENCY_PRODUCT_RATE){
  490. // return false
  491. // }
  492. row.sellPrice = (row.CURRENCY_PRODUCT_RATE * this.form.sellPriceStandard).toFixed(2)
  493. row.marketPrice = (row.sellPrice * 1.2).toFixed(2)
  494. },
  495. taxRateInput(scope){
  496. const value = parseFloat(scope.row.taxRate) || 0;
  497. if (value <= 0) {
  498. scope.row.taxRate = ''; // 更新输入框的值
  499. } else {
  500. let moment = this.availableCountriesTableForm.availableCountriesList[scope.$index]
  501. this.$set(this.availableCountriesTableForm.availableCountriesList,scope.$index, moment)
  502. }
  503. },
  504. marketPriceInput(scope){
  505. const value = parseFloat(scope.row.marketPrice) || 0;
  506. if (value <= 0) {
  507. scope.row.marketPrice = ''; // 更新输入框的值
  508. } else {
  509. let moment = this.availableCountriesTableForm.availableCountriesList[scope.$index]
  510. this.$set(this.availableCountriesTableForm.availableCountriesList,scope.$index, moment)
  511. }
  512. },
  513. submitAvailableCountries(){
  514. this.form.nature = this.multipleSelectionCountries
  515. this.editAvailableCountriesDialog = false
  516. },
  517. editAvailableCountries(){
  518. this.editAvailableCountriesDialog = true
  519. this.toggleSelection(this.form.nature,'data')
  520. },
  521. handleSelectionChange (val) {
  522. this.multipleSelection = val
  523. },
  524. handleCurrentChange (page) {
  525. this.getData(page, this.pageSize)
  526. },
  527. handleSizeChange (pageSize) {
  528. this.getData(this.currentPage, pageSize)
  529. },
  530. handleFilterUser (filterData) {
  531. filterHelper.handleFilterUser(this, filterData)
  532. },
  533. checkSelectable (row) {
  534. return row.DONT_DEL !== '1'
  535. },
  536. handleFilter () {
  537. this.getData()
  538. },
  539. handlestate () {
  540. this.$router.push({path: `/shop/goods-add`})
  541. },
  542. upLoadSuccess (file) {
  543. this.form.cover = tool.getArImage(file, '/files/')
  544. this.form.coverOrigin = file
  545. this.img_show = false
  546. },
  547. handleEditShow (row) {
  548. this.dialogEditLoading = true
  549. this.auditId = row.ID
  550. this.dialogEditFormVisible = true
  551. let vueObj = this
  552. getGoodsDetail({id: this.auditId}).then(response => {
  553. vueObj.dialogEditLoading = false
  554. vueObj.goodsType = response.data.goodsType
  555. vueObj.categoryType = response.data.categoryType
  556. let gift = response.data.goodsInfo.GIFT_TYPE;
  557. let gift_type = response.data.giftType
  558. let giftType = []
  559. if (gift.length > 0) {
  560. for (let i in gift_type) {
  561. giftType.push({key: i, name: gift_type[i].name, checked: false})
  562. gift.map((v, k) => {
  563. if (v === i) {
  564. giftType[i - 1].checked = true
  565. }
  566. })
  567. }
  568. }
  569. vueObj.GiftTypeArr = giftType
  570. vueObj.sell_type = response.data.goodsInfo.SELL_TYPE;
  571. vueObj.form.goodsName = response.data.goodsInfo.GOODS_NAME
  572. vueObj.form.sellDiscount = response.data.goodsInfo.SELL_DISCOUNT
  573. vueObj.form.goodsNo = response.data.goodsInfo.GOODS_NO
  574. vueObj.form.type = response.data.goodsInfo.TYPE
  575. vueObj.form.unit = response.data.goodsInfo.UNIT
  576. vueObj.form.marketPrice = response.data.goodsInfo.MARKET_PRICE
  577. vueObj.form.sellPrice = response.data.goodsInfo.SELL_PRICE
  578. vueObj.form.sellPriceStandard = response.data.goodsInfo.SELL_PRICE_STANDARD
  579. vueObj.form.pricePv = response.data.goodsInfo.PRICE_PV
  580. vueObj.form.point = response.data.goodsInfo.POINT
  581. vueObj.form.storeNums = response.data.goodsInfo.STORE_NUMS
  582. vueObj.form.content = response.data.goodsInfo.CONTENT
  583. vueObj.form.sort = response.data.goodsInfo.SORT
  584. vueObj.form.id = response.data.goodsInfo.ID
  585. vueObj.form.pvSplit = response.data.goodsInfo.PV_SPLIT
  586. vueObj.form.categoryType = parseInt(response.data.goodsInfo.CATEGORY_TYPE)
  587. vueObj.form.taxRate = response.data.goodsInfo.TAX_RATE
  588. vueObj.form.coverOrigin = response.data.goodsInfo.COVER
  589. vueObj.form.cover = tool.getArImage(response.data.goodsInfo.COVER, '/files/')
  590. vueObj.availableCountriesTableForm.availableCountriesList = response.data.goodsInfo.SHOP_GOODS_NATURE
  591. vueObj.form.autoMaintenance = response.data.goodsInfo.AUTO_MAINTENANCE
  592. const goods = JSON.parse(JSON.stringify(response.data.goodsInfo.SHOP_GOODS_NATURE))
  593. let nature = []
  594. goods.find(item => { // 表单数据
  595. if(item.SHOP_GOODS_NATURE.length > 0) {
  596. item.sellPrice = item.SHOP_GOODS_NATURE[0].SELL_PRICE
  597. item.taxRate = item.SHOP_GOODS_NATURE[0].TAX_RATE
  598. item.marketPrice = item.SHOP_GOODS_NATURE[0].MARKET_PRICE
  599. nature.push(item)
  600. }
  601. vueObj.form.nature = JSON.parse(JSON.stringify(nature))
  602. })
  603. console.log(vueObj.form.nature)
  604. this.$forceUpdate()
  605. }).catch(err => {
  606. })
  607. },
  608. toggleSelection(rows, type) {
  609. let data = JSON.parse(JSON.stringify(rows))
  610. if(data.length > 0 && type === 'input'){
  611. let checkedData = this.form.nature
  612. checkedData.forEach(item => { // checkedData为已选数据
  613. this.$nextTick( ()=>{
  614. this.availableCountriesTableForm.availableCountriesList.find(obj => { // 表单数据
  615. if(item.ID === obj.ID) {
  616. obj.sellPrice = (item.CURRENCY_PRODUCT_RATE * this.form.sellPriceStandard).toFixed(2)
  617. obj.taxRate = item.taxRate
  618. obj.marketPrice = (obj.sellPrice * 1.2).toFixed(2)
  619. this.$refs.multipleTableCountries.toggleRowSelection(obj,true)
  620. }
  621. })
  622. })
  623. })
  624. return false
  625. }
  626. else if (data.length > 0 && type === 'data') {
  627. data.forEach(item => { // checkedData为已选数据
  628. this.$nextTick( ()=>{
  629. this.availableCountriesTableForm.availableCountriesList.find(obj => { // 表单数据
  630. if(item.ID === obj.ID) {
  631. obj.sellPrice = item.sellPrice
  632. obj.taxRate = item.taxRate
  633. obj.marketPrice = item.marketPrice
  634. this.$refs.multipleTableCountries.toggleRowSelection(obj,true)
  635. }
  636. })
  637. })
  638. })
  639. } else {
  640. this.$refs.multipleTableCountries.clearSelection();
  641. }
  642. },
  643. handleEdit () {
  644. this.dialogEditFormVisible = false
  645. this.$message({
  646. message: this.$t('common.modifyData'), // 正在修改数据
  647. type: 'info'
  648. })
  649. // let sen_sell=[];
  650. // this.sell_type.map((item,index)=>{
  651. // if(item.checked){
  652. // sen_sell.push(item.key);
  653. // }
  654. // })
  655. // this.form.sellType=sen_sell;
  656. let sen_gift = []
  657. this.GiftTypeArr.map((item, index) => {
  658. if (item.checked) {
  659. sen_gift.push(item.key)
  660. }
  661. })
  662. this.form.giftType = sen_gift
  663. this.form.sellType = 1
  664. this.form.cover = this.form.coverOrigin
  665. delete this.form.coverOrigin
  666. editGoodsData({...this.form}).then(response => {
  667. this.$message({
  668. message: response.data,
  669. type: 'success'
  670. })
  671. this.getData(this.currentPage, this.pageSize)
  672. }).catch(err => {
  673. this.$message({
  674. message:err,
  675. type: 'error'
  676. })
  677. })
  678. },
  679. handleDel (id = null) {
  680. let obj = this
  681. this.$confirm(this.$t('common.deleteTips'), this.$t('common.hint'), { // '确定删除选定的数据?', '提示'
  682. confirmButtonText: this.$t('common.confirm'), // 确定
  683. cancelButtonText: this.$t('common.cancel'), // 取消
  684. type: 'warning'
  685. }).then(() => {
  686. let selectedIds = []
  687. if (id === null) {
  688. for (let val of obj.multipleSelection) {
  689. selectedIds.push(val.ID)
  690. }
  691. } else {
  692. selectedIds.push(id)
  693. }
  694. goodsDelete({selected: selectedIds}).then(response => {
  695. this.$message({
  696. message: response.data,
  697. type: 'success'
  698. })
  699. obj.getData(obj.currentPage, obj.pageSize)
  700. }).catch(err => {
  701. this.$message({
  702. message: err,
  703. type: 'error'
  704. })
  705. })
  706. })
  707. },
  708. getData (page, pageSize) {
  709. let filterData = this.filterModel
  710. /* this.allData = response */
  711. let vueObj=this
  712. const paramsData = Object.assign({
  713. page: (page === null || page == undefined) ? 1 : page,
  714. pageSize: (pageSize === null || pageSize == undefined) ? vueObj.pageSize : pageSize
  715. }, filterData)
  716. shopList(paramsData).then(response => {
  717. vueObj.tableHeaders = response.data.columnsShow ? response.data.columnsShow : []
  718. vueObj.tableData = response.data.list
  719. vueObj.filterTypes = response.data.filterTypes
  720. vueObj.currentPage = page
  721. vueObj.totalPages = parseInt(response.data.totalPages)
  722. vueObj.totalCount = parseInt(response.data.totalCount)
  723. vueObj.pageSize = pageSize
  724. this.loading = false
  725. }).catch(err => {
  726. this.loading = false
  727. this.$message({
  728. message: err,
  729. type: 'error'
  730. })
  731. })
  732. },
  733. handleGoodUp (id) {
  734. updateGoodsStatus({selectedIds: id, status: 1}).then(response => {
  735. this.$message({
  736. message: response.data,
  737. type: 'success'
  738. })
  739. this.getData(this.currentPage, this.pageSize)
  740. }).catch(err => {
  741. this.$message({
  742. message: err,
  743. type: 'error'
  744. })
  745. })
  746. },
  747. handleGoodDown (id) {
  748. updateGoodsStatus({selectedIds: id, status: 0}).then(response => {
  749. this.$message({
  750. message: response.data,
  751. type: 'success'
  752. })
  753. this.getData(this.currentPage, this.pageSize)
  754. }).catch(err => {
  755. this.$message({
  756. message: err,
  757. type: 'error'
  758. })
  759. })
  760. },
  761. handleExport () {
  762. this.$confirm(this.$t('financial.exportNotice'), this.$t('common.hint'), { // 确定要导出当前数据吗?`, '提示'
  763. confirmButtonText: this.$t('common.confirm'), // 确定
  764. cancelButtonText: this.$t('common.cancel'), // 取消
  765. type: 'warning'
  766. }).then(() => {
  767. goodsListExport(this.filterModel).then(response => {
  768. this.$message({
  769. message: response.data,
  770. type: 'success'
  771. })
  772. }).catch(err => {
  773. this.$message({
  774. message: err,
  775. type: 'error'
  776. })
  777. })
  778. })
  779. },
  780. },
  781. watch: {
  782. // 监听商品分类,控制PV是否展示
  783. 'form.categoryType': {
  784. deep: true,
  785. handler (modern, origin) {
  786. this.pvDisabled = (parseInt(modern) === 1)
  787. }
  788. },
  789. // 监听商品标准价格,自动计算销售价格
  790. // 'form.sellPriceStandard': {
  791. // deep: true,
  792. // handler(modern, origin) {
  793. //
  794. // }
  795. // },
  796. }
  797. }
  798. </script>
  799. <style scoped>
  800. .table-box .el-form-item__label {
  801. width: 100px;
  802. color: #99a9bf;
  803. }
  804. .table-box .el-form-item {
  805. width: 30%;
  806. margin-right: 0;
  807. margin-bottom: 0;
  808. }
  809. /* /deep/ .el-dialog .el-form-item__label {
  810. width:100%;
  811. text-align: left;
  812. } */
  813. /deep/ img {
  814. width: 100% !important;
  815. height: 100% !important;
  816. }
  817. @media (max-width:862px) {
  818. /deep/ .el-dialog {
  819. width:100%;
  820. }
  821. }
  822. ::v-deep .el-input-number {
  823. width: 100% !important;
  824. .el-input {
  825. width: auto !important;
  826. padding: 0 5px;
  827. }
  828. }
  829. ::v-deep .el-input-number .el-input__inner {
  830. text-align: left;
  831. }
  832. ::v-deep .el-form-item{
  833. transform: translateY(6px);
  834. }
  835. /* 去掉全选按钮 */
  836. ::v-deep .el-table .disabledCheck .cell .el-checkbox__inner {
  837. display: none !important;
  838. }
  839. ::v-deep .el-table .disabledCheck .cell::before {
  840. content: '';
  841. text-align: center;
  842. line-height: 37px;
  843. }
  844. </style>