index.vue 36 KB

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