123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575 |
- define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'toastr'], function ($, undefined, Backend, Table, Form, Toastr) {
- var Controller = {
- index: function () {
- function debounce(handle, delay) {
- let time = null;
- return function () {
- let self = this,
- arg = arguments;
- clearTimeout(time);
- time = setTimeout(function () {
- handle.apply(self, arg);
- }, delay)
- }
- }
- var goodsIndex = new Vue({
- el: "#goodsIndex",
- data() {
- return {
- goodsData: [],
- multipleSelection: [],
- chooseType: 0,
- activityType: 'all',
- activeStatus: 'all',
- searchKey: '',
- priceFrist: '',
- priceLast: '',
- sort: 'id',
- order: 'desc',
- offset: 0,
- limit: 10,
- totalPage: 0,
- currentPage: 1,
- rowDel: false,
- allDel: false,
- upStatus: true,
- allAjax: true,
- tableAjax: false
- }
- },
- created() {
- this.getData();
- },
- methods: {
- getData() {
- let that = this;
- if (!that.allAjax) {
- that.tableAjax = true;
- }
- let dataAc = {
- search: that.searchKey,
- status: that.activeStatus,
- activity_type: that.activityType,
- min_price: that.priceFrist,
- max_price: that.priceLast,
- offset: that.offset,
- limit: that.limit,
- sort: that.sort,
- order: that.order,
- };
- if (that.activityType == 'score') {
- dataAc = {
- search: that.searchKey,
- status: that.activeStatus,
- app_type: that.activityType,
- min_price: that.priceFrist,
- max_price: that.priceLast,
- offset: that.offset,
- limit: that.limit,
- sort: that.sort,
- order: that.order,
- };
- }
- Fast.api.ajax({
- url: 'shopro/goods/goods/index',
- loading: false,
- type: 'GET',
- data: dataAc
- }, function (ret, res) {
- that.goodsData = res.data.rows;
- that.goodsData.forEach(i => {
- i.showFlag = false;
- i.rowDel = false;
- });
- that.totalPage = res.data.total;
- that.allAjax = false;
- that.tableAjax = false;
- return false;
- }, function (ret, res) {
- that.allAjax = false;
- that.tableAjax = false;
- })
- },
- tabOpt(tab, event) {
- this.activeStatus = tab.name
- },
- goodsOpt(type, id) {
- let that = this;
- switch (type) {
- case 'create':
- Fast.api.open('shopro/goods/goods/add', '新增商品', {
- callback() {
- that.getData();
- }
- })
- break;
- case 'edit':
- Fast.api.open('shopro/goods/goods/edit/ids/' + id + "?id=" + id + "&type=edit", '编辑商品', {
- callback() {
- that.getData();
- }
- })
- break;
- case 'down':
- let idArr = []
- if (that.multipleSelection.length > 0) {
- that.multipleSelection.forEach(i => {
- idArr.push(i.id)
- })
- let idss = idArr.join(',')
- that.editStatus(idss, 'down')
- }
- break;
- case 'up':
- let idArrup = []
- if (that.multipleSelection.length > 0) {
- that.multipleSelection.forEach(i => {
- idArrup.push(i.id)
- })
- let idup = idArrup.join(',')
- that.editStatus(idup, 'up')
- }
- break;
- case 'del':
- let ids;
- if (id) {
- ids = id;
- } else {
- let idArr = []
- if (that.multipleSelection.length > 0) {
- that.multipleSelection.forEach(i => {
- idArr.push(i.id)
- })
- ids = idArr.join(',')
- }
- }
- if (ids) {
- that.$confirm('此操作将删除商品, 是否继续?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- Fast.api.ajax({
- url: 'shopro/goods/goods/del/ids/' + ids,
- loading: true,
- type: 'POST',
- }, function (ret, res) {
- that.getData();
- return false;
- })
- }).catch(() => {
- that.$message({
- type: 'info',
- message: '已取消删除'
- });
- });
- }
- break;
- case 'copy':
- Fast.api.open('shopro/goods/goods/edit/ids/' + id + "?id=" + id + "&type=copy", '商品详情', {
- callback() {
- that.getData();
- }
- })
- break;
- case 'filter':
- that.offset = 0;
- that.limit = 10;
- that.currentPage = 1;
- that.getData();
- break;
- case 'clear':
- that.activityType = 'all';
- that.priceFrist = "";
- that.priceLast = "";
- break;
- case 'recycle':
- Fast.api.open('shopro/goods/goods/recyclebin', '查看回收站')
- break;
- default:
- Fast.api.open('shopro/goods/goods/edit/ids/' + type.id + "?id=" + type.id + "&type=edit", '编辑商品', {
- callback() {
- that.getData();
- }
- })
- break;
- }
- },
- hideup() {
- for (key in this.selectedRowId) {
- this.selectedRowId[key] = false;
- }
- },
- sortOrder(sort, order) {
- this.sort = sort;
- this.order = order;
- this.getData();
- },
- handleSelectionChange(val) {
- this.multipleSelection = val;
- },
- handleSizeChange(val) {
- this.offset = 0
- this.limit = val;
- this.currentPage = 1;
- this.getData()
- },
- handleCurrentChange(val) {
- this.currentPage = val;
- this.offset = (val - 1) * this.limit;
- this.getData()
- },
- editStatus(id, type) {
- let that = this;
- Fast.api.ajax({
- url: `shopro/goods/goods/setStatus/ids/${id}/status/${type}`,
- loading: true,
- }, function (ret, res) {
- that.getData();
- return false;
- })
- },
- chooseOpt(type) {
- this.activityType = type
- },
- isShoose() {
- this.chooseType == 0 ? 1 : 0;
- if (this.chooseType == 0) {
- this.activityType = 'all';
- this.priceFrist = "";
- this.priceLast = "";
- }
- },
- tableRowClassName({
- rowIndex
- }) {
- if (rowIndex % 2 == 1) {
- return 'bg-color';
- }
- return '';
- },
- tableCellClassName({
- columnIndex
- }) {
- if (columnIndex == 2) {
- return 'cell-left';
- }
- return '';
- },
- debounceFilter: debounce(function () {
- this.getData()
- }, 1000),
- },
- watch: {
- activeStatus(newVal, oldVal) {
- if (newVal != oldVal) {
- this.offset = 0;
- this.limit = 10;
- this.currentPage = 1;
- this.getData();
- }
- },
- searchKey(newVal, oldVal) {
- if (newVal != oldVal) {
- this.offset = 0;
- this.limit = 10;
- this.currentPage = 1;
- this.debounceFilter();
- }
- },
- },
- })
- },
- recyclebin: function () {
- // 初始化表格参数配置
- Table.api.init({
- extend: {
- 'dragsort_url': ''
- }
- });
- var table = $("#table");
- // 初始化表格
- table.bootstrapTable({
- url: 'shopro/goods/goods/recyclebin' + location.search,
- pk: 'id',
- sortName: 'deletetime',
- columns: [
- [{
- checkbox: true
- },
- {
- field: 'id',
- title: __('Id')
- },
- {
- field: 'title',
- title: __('Title'),
- align: 'left'
- },
- {
- field: 'deletetime',
- title: __('Deletetime'),
- operate: 'RANGE',
- addclass: 'datetimerange',
- formatter: Table.api.formatter.datetime
- },
- {
- field: 'operate',
- width: '130px',
- title: __('Operate'),
- table: table,
- events: Table.api.events.operate,
- buttons: [{
- name: 'Restore',
- text: __('Restore'),
- classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
- icon: 'fa fa-rotate-left',
- url: 'shopro/goods/goods/restore',
- refresh: true
- },
- {
- name: 'Destroy',
- text: __('Destroy'),
- classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
- icon: 'fa fa-times',
- url: 'shopro/goods/goods/destroy',
- refresh: true
- }
- ],
- formatter: Table.api.formatter.operate
- }
- ]
- ]
- });
- // 为表格绑定事件
- Table.api.bindevent(table);
- },
- add: function () {
- Controller.initAddEdit(null, null, [], []);
- },
- edit: function () {
- let id, type
- window.location.search.replace("?", '').split('&').forEach(i => {
- if (i.split('=')[0] == 'id') {
- id = i.split('=')[1]
- }
- if (i.split('=')[0] == 'type') {
- type = i.split('=')[1]
- }
- })
- Controller.initAddEdit(id, type, Config.skuList, Config.skuPrice);
- },
- select: function () {
- function debounce(handle, delay) {
- let time = null;
- return function () {
- let self = this,
- arg = arguments;
- clearTimeout(time);
- time = setTimeout(function () {
- handle.apply(self, arg);
- }, delay)
- }
- }
- var goodsSelect = new Vue({
- el: "#goodsSelect",
- data() {
- return {
- categoryData: [],
- searchWhere: '',
- goodsList: [],
- totalPage: 0,
- offset: 0,
- currentPage: 1,
- multiple: new URLSearchParams(location.search).get('multiple'),
- category_id: null,
- selectedIds: []
- }
- },
- mounted() {
- if (new URLSearchParams(location.search).get('ids')) {
- this.selectedIds = new URLSearchParams(location.search).get('ids').split(',')
- }
- this.getList();
- this.categoryData = Config.category
- },
- methods: {
- getList(id) {
- let that = this;
- let url = "shopro/goods/goods/select?status=up,hidden";
- if (id) {
- url = 'shopro/goods/goods/select?status=up,hidden&category_id=' + id
- }
- Fast.api.ajax({
- url: url,
- data: {
- limit: 10,
- offset: that.offset,
- search: that.searchWhere
- },
- type: 'GET'
- }, function (ret, res) {
- that.goodsList = res.data.rows;
- that.goodsList.forEach(g => {
- that.$set(g, 'checked', false)
- })
- let selectData = []
- that.goodsList.forEach(g => {
- if (that.selectedIds.includes(g.id + '')) {
- selectData.push(g)
- }
- })
- that.$nextTick(() => {
- selectData.forEach(row => {
- that.$refs.multipleTable.toggleRowSelection(row);
- });
- })
- that.totalPage = res.data.total;
- return false;
- })
- },
- singleSelectionChange(row) {
- this.selectedIds = []
- this.selectedIds.push(row.id)
- this.goodsList.forEach(g => {
- if (g.id == row.id) {
- this.$set(g, 'checked', true)
- } else {
- this.$set(g, 'checked', false)
- }
- })
- this.$forceUpdate()
- },
- multipleSelectionChange(val) {
- val.forEach(g => {
- if (!this.selectedIds.includes(g.id + '')) {
- this.selectedIds.push(g.id + '')
- }
- })
- },
- SelectionChange(selection, row) {
- if (this.selectedIds.indexOf(row.id + '') != -1) {
- this.selectedIds.splice(this.selectedIds.indexOf(row.id + ''), 1)
- }
- },
- changeClick(val) {
- this.currentPage = val;
- this.offset = 10 * (val - 1);
- if (this.category_id == null) {
- this.getList()
- } else {
- this.getList(this.category_id)
- }
- },
- operation() {
- let that = this;
- let domain = window.location.origin;
- if (this.selectedIds.length == 0) {
- return false
- }
- let ids = this.multiple == 'true' ? this.selectedIds.join(',') : this.selectedIds[this.selectedIds.length - 1]
- Fast.api.ajax({
- url: domain + '/addons/shopro/goods/lists?goods_ids=' + ids + "&per_page=999999999&type=all",
- loading: false,
- }, function (ret, res) {
- Fast.api.close({
- data: that.multiple == 'true' ? res.data.data : res.data.data[0],
- });
- return false;
- }, function () {
- return false;
- })
- },
- debounceFilter: debounce(function () {
- this.getList()
- }, 1000),
- showLeft(p, c, a, s) {
- if (p != null && a === null && c === null && s === null) {
- this.categoryData[p].show = !this.categoryData[p].show;
- }
- if (p != null && c != null && a == null && s === null) {
- this.categoryData[p].children[c].show = !this.categoryData[p].children[c].show;
- }
- if (p != null && c != null && a != null && s === null) {
- this.categoryData[p].children[c].children[a].show = !this.categoryData[p].children[c].children[a].show;
- }
- this.$forceUpdate();
- },
- selectCategoryLeft(p, c, a, s) {
- this.categoryData.forEach(i => {
- i.selected = false;
- if (i.children && i.children.length > 0) {
- i.children.forEach(j => {
- j.selected = false;
- if (j.children && j.children.length > 0) {
- j.children.forEach(k => {
- k.selected = false;
- if (k.children && k.children.length > 0) {
- k.children.forEach(l => {
- l.selected = false;
- })
- }
- })
- }
- })
- }
- })
- let category_id = null;
- if (p != null && a === null && c === null && s === null) {
- this.categoryData[p].selected = !this.categoryData[p].selected;
- category_id = this.categoryData[p].id
- }
- if (p != null && c != null && a == null && s === null) {
- this.categoryData[p].children[c].selected = !this.categoryData[p].children[c].selected;
- category_id = this.categoryData[p].children[c].id
- }
- if (p != null && c != null && a != null && s === null) {
- this.categoryData[p].children[c].children[a].selected = !this.categoryData[p].children[c].children[a].selected;
- category_id = this.categoryData[p].children[c].children[a].id
- }
- if (p != null && c != null && a != null && s != null) {
- this.categoryData[p].children[c].children[a].children[s].selected = !this.categoryData[p].children[c].children[a].children[s].selected;
- category_id = this.categoryData[p].children[c].children[a].children[s].id
- }
- this.category_id = category_id;
- this.offset = 0;
- this.getList(category_id)
- this.$forceUpdate();
- },
- },
- watch: {
- searchWhere(newVal, oldVal) {
- if (newVal != oldVal) {
- this.offset = 0;
- this.currentPage = 1;
- this.categoryData.forEach(i => {
- i.selected = false;
- if (i.children && i.children.length > 0) {
- i.children.forEach(j => {
- j.selected = false;
- if (j.children && j.children.length > 0) {
- j.children.forEach(k => {
- k.selected = false;
- if (k.children && k.children.length > 0) {
- k.children.forEach(l => {
- l.selected = false;
- })
- }
- })
- }
- })
- }
- })
- this.debounceFilter();
- }
- },
- },
- })
- },
- api: {
- bindevent: function () {
- Form.api.bindevent($("form[role=form]"));
- }
- },
- initAddEdit: function (id, type, skuList, skuPrice) {
- Vue.directive('enterNumber', {
- inserted: function (el) {
- let changeValue = (el, type) => {
- const e = document.createEvent('HTMLEvents')
- e.initEvent(type, true, true)
- el.dispatchEvent(e)
- }
- el.addEventListener("keyup", function (e) {
- let input = e.target;
- let reg = new RegExp('^((?:(?:[1-9]{1}\\d*)|(?:[0]{1}))(?:\\.(?:\\d){0,2})?)(?:\\d*)?$');
- let matchRes = input.value.match(reg);
- if (matchRes === null) {
- input.value = "";
- } else {
- if (matchRes[1] !== matchRes[0]) {
- input.value = matchRes[1];
- }
- }
- changeValue(input, 'input')
- });
- }
- });
- Vue.directive('positiveInteger', {
- inserted: function (el) {
- el.addEventListener("keypress", function (e) {
- e = e || window.event;
- let charcode = typeof e.charCode == 'number' ? e.charCode : e.keyCode;
- let re = /\d/;
- if (!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey) {
- if (e.preventDefault) {
- e.preventDefault();
- } else {
- e.returnValue = false;
- }
- }
- });
- }
- });
- //vue Sku添加页 添加规格和价格数据
- var goodsDetail = new Vue({
- el: "#goodsDetail",
- data() {
- return {
- editId: id,
- type: type,
- stepActive: 1,
- goodsDetail: {},
- goodsDetailInit: {
- category_ids: '',
- content: '',
- dispatch_ids: '',
- express_ids: '', //单个数组
- store_ids: '',
- selfetch_ids: '',
- autosend_ids: '',
- dispatch_type: '',
- expire_day: 0, //有效时间
- image: '',
- images: '',
- is_sku: 0,
- original_price: '',
- params: '',
- params_arr: [],
- price: '',
- service_ids: '',
- show_sales: '',
- status: 'up',
- subtitle: '',
- title: '',
- type: 'normal',
- views: '',
- weigh: '',
- weight: '',
- stock: '',
- stock_warning_switch: false,
- stock_warning: null,
- sn: '',
- autosend_content: ''
- },
- timeData: {
- images_arr: [],
- category_ids_arr: [],
- dispatch_type_arr: [], //类型
- dispatch_ids_arr: [], //id数组
- service_ids_arr: [], //服务
- },
- rules: {
- title: [{
- required: true,
- message: '请输入商品标题',
- trigger: 'blur'
- }],
- subtitle: [{
- required: true,
- message: '请输入商品副标题',
- trigger: 'blur'
- }],
- status: [{
- required: true,
- message: '请选择商品状态',
- trigger: 'blur'
- }],
- image: [{
- required: true,
- message: '请上传商品主图',
- trigger: 'change'
- }],
- images: [{
- required: true,
- message: '请上传商品轮播图',
- trigger: 'change'
- }],
- category_ids: [{
- required: true,
- message: '请选择商品分类',
- trigger: 'change'
- }],
- dispatch_type: [{
- required: true,
- message: '请选择配送方式',
- trigger: 'blur'
- }],
- dispatch_ids: [{
- required: true,
- message: '请选择运费模板',
- trigger: 'blur'
- }],
- express_ids: [{
- required: true,
- message: '请选择运费模板',
- trigger: 'blur'
- }],
- store_ids: [{
- required: true,
- message: '请选择配送模板',
- trigger: 'blur'
- }],
- selfetch_ids: [{
- required: true,
- message: '请选择自提模板',
- trigger: 'blur'
- }],
- autosend_ids: [{
- required: true,
- message: '请选择发货模板',
- trigger: 'blur'
- }],
- is_sku: [{
- required: true,
- message: '请选择商品规格',
- trigger: 'blur'
- }],
- price: [{
- required: true,
- message: '请输入价格',
- trigger: 'blur'
- }],
- original_price: [{
- required: true,
- message: '请输入划线价格',
- trigger: 'blur'
- }],
- // weight: [{
- // required: true,
- // message: '请输入重量',
- // trigger: 'blur'
- // }],
- stock: [{
- required: true,
- message: '请输入库存',
- trigger: 'blur'
- }],
- service_ids: [{
- required: true,
- message: '请选择服务标签',
- trigger: 'blur'
- }]
- },
- mustDel: ['express_ids', 'store_ids', 'selfetch_ids', 'autosend_ids'],
- //选择分类
- categoryOptions: [],
- //服务
- serviceOptions: [],
- dispatchType: [],
- dispatchOptions: {},
- upload: Config.moduleurl,
- editor: null,
- //多规格
- skuList: [],
- skuPrice: [],
- skuListData: '',
- skuPriceData: '',
- skuModal: '',
- childrenModal: [],
- countId: 1,
- allEditSkuName: '',
- isEditInit: false, // 编辑时候初始化是否完成
- isResetSku: 0,
- allEditPopover: {
- price: false,
- stock: false,
- stock_warning: false,
- weight: false,
- sn: false,
- },
- allEditDatas: "",
- allstock_warning_switch: false,
- visible: false,
- visibless: '',
- activeName: null,
- activeIndex: null,
- defaultProps: {
- children: 'children',
- label: 'name'
- },
- selectedcatArr: []
- }
- },
- mounted() {
- this.getServiceOptions();
- this.getDispatchType();
- if (this.editId) {
- this.goodsDetail = JSON.parse(JSON.stringify(this.goodsDetailInit));
- this.getCategoryOptions(true);
- } else {
- this.getCategoryOptions();
- this.goodsDetail = JSON.parse(JSON.stringify(this.goodsDetailInit));
- this.getInit([], [])
- this.$nextTick(() => {
- Controller.api.bindevent();
- });
- }
- },
- methods: {
- handleClickss(tab) {
- this.activeIndex = Number(tab.index)
- },
- createCategory() {
- let that = this;
- Fast.api.open("shopro/category/index", "新建", {
- callback(data) {
- that.getCategoryOptions();
- }
- });
- },
- panelChange(val) {
- let that = this;
- that.selectedcatArr = [];
- let nameArr = []
- let idsArr = []
- if (val.length > 0) {
- val.forEach(j => {
- let arr = []
- if (j.length == 1) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- }
- })
- } else if (j.length == 2) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- c.children.forEach(a => {
- if (a.id == j[1]) {
- arr.push(a.name)
- }
- })
- }
- })
- } else if (j.length == 3) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- c.children.forEach(a => {
- if (a.id == j[1]) {
- arr.push(a.name)
- a.children.forEach(t => {
- if (t.id == j[2]) {
- arr.push(t.name)
- }
- })
- }
- })
- }
- })
- }
- nameArr.push({
- label: arr.join('/'),
- })
- idsArr.push(j[j.length - 1])
- })
- }
- that.selectedcatArr = nameArr;
- that.goodsDetail.category_ids = idsArr.join(',');
- },
- closeTag(val) {
- this.timeData.category_ids_arr.splice(val, 1);
- this.selectedcatArr.splice(val, 1)
- let idsArr = []
- this.timeData.category_ids_arr.forEach(j => {
- idsArr.push(j[j.length - 1])
- })
- this.goodsDetail.category_ids = idsArr.join(',');
- this.panelChange(this.timeData.category_ids_arr)
- this.$forceUpdate()
- },
- createTemplate(type) {
- let that = this;
- if (type == 'service') {
- Fast.api.open("shopro/goods/service/add", "新建");
- } else {
- Fast.api.open("shopro/dispatch/" + type + "/add", "新建", {
- callback(data) {
- if (data.data) {
- that.getDispatchTemplateData(type, 'create'); //TODO 判断type
- }
- }
- });
- }
- },
- getInit(skuList, skuPrice) {
- // 记录每个规格项真实 id,对应的临时 id
- let tempIdArr = {};
- for (let i in skuList) {
- // 为每个 规格增加当前页面自增计数器,比较唯一用
- skuList[i]['temp_id'] = this.countId++
- for (let j in skuList[i]['children']) {
- // 为每个 规格项增加当前页面自增计数器,比较唯一用
- skuList[i]['children'][j]['temp_id'] = this.countId++
- // 记录规格项真实 id 对应的 临时 id
- tempIdArr[skuList[i]['children'][j]['id']] = skuList[i]['children'][j]['temp_id']
- }
- }
- // for (let i in skuPrice) {
- for (var i = 0; i < skuPrice.length; i++) {
- let tempSkuPrice = skuPrice[i]
- tempSkuPrice['temp_id'] = i + 1
- // 将真实 id 数组,循环,找到对应的临时 id 组合成数组
- tempSkuPrice['goods_sku_temp_ids'] = [];
- let goods_sku_id_arr = tempSkuPrice['goods_sku_ids'].split(',');
- for (let ids of goods_sku_id_arr) {
- tempSkuPrice['goods_sku_temp_ids'].push(tempIdArr[ids])
- }
- skuPrice[i] = tempSkuPrice
- }
- if (this.type == 'copy') {
- for (let i in skuList) {
- // 为每个 规格增加当前页面自增计数器,比较唯一用
- skuList[i].id = 0;
- for (let j in skuList[i]['children']) {
- skuList[i]['children'][j].id = 0;
- }
- }
- }
- if (skuPrice.length > 0) {
- skuPrice.forEach(si => {
- si.stock_warning_switch = false
- if (si.stock_warning || si.stock_warning == 0) {
- si.stock_warning_switch = true
- }
- })
- }
- this.skuList = skuList;
- this.skuPrice = skuPrice;
- setTimeout(() => {
- // 延迟触发更新下面列表
- this.isEditInit = true;
- }, 200)
- },
- getEditData() {
- let that = this;
- Fast.api.ajax({
- url: 'shopro/goods/goods/detail/ids/' + that.editId,
- loading: true,
- }, function (ret, res) {
- for (key in that.goodsDetail) {
- if (res.data.detail[key]) {
- that.goodsDetail[key] = res.data.detail[key]
- } else {
- that.goodsDetail.express_ids = res.data.detail.dispatch_group_ids_arr.express ? res.data.detail.dispatch_group_ids_arr.express : '';
- that.goodsDetail.store_ids = res.data.detail.dispatch_group_ids_arr.store ? res.data.detail.dispatch_group_ids_arr.store : '';
- that.goodsDetail.selfetch_ids = res.data.detail.dispatch_group_ids_arr.selfetch ? res.data.detail.dispatch_group_ids_arr.selfetch : '';
- that.goodsDetail.autosend_ids = res.data.detail.dispatch_group_ids_arr.autosend ? res.data.detail.dispatch_group_ids_arr.autosend : '';
- }
- }
- for (key in that.timeData) {
- if (res.data.detail[key]) {
- that.timeData[key] = res.data.detail[key]
- }
- }
- let activeId = ''
- that.timeData.category_ids_arr.forEach(i => {
- activeId = i[0];
- i.splice(0, 1)
- })
- if (that.categoryOptions.length > 0) {
- that.categoryOptions.forEach((j, index) => {
- if (j.id == activeId) {
- that.activeName = j.name;
- that.activeIndex = index;
- }
- })
- }
- let nameArr = [];
- that.selectedcatArr = []
- if (that.timeData.category_ids_arr.length > 0) {
- that.timeData.category_ids_arr.forEach(j => {
- let arr = []
- if (j.length == 1) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- }
- })
- } else if (j.length == 2) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- c.children.forEach(a => {
- if (a.id == j[1]) {
- arr.push(a.name)
- }
- })
- }
- })
- } else if (j.length == 3) {
- that.categoryOptions[that.activeIndex].children.forEach(c => {
- if (c.id == j[0]) {
- arr.push(c.name)
- c.children.forEach(a => {
- if (a.id == j[1]) {
- arr.push(a.name)
- a.children.forEach(t => {
- if (t.id == j[2]) {
- arr.push(t.name)
- }
- })
- }
- })
- }
- })
- }
- nameArr.push({
- label: arr.join('/'),
- })
- })
- }
- that.selectedcatArr = nameArr;
- that.timeData.dispatch_type_arr.forEach(i => {
- that.getDispatchTemplateData(i, 'edit');
- })
- that.getInit(res.data.skuList, res.data.skuPrice);
- Controller.api.bindevent();
- $('#c-content').html(res.data.detail.content)
- // 库存预警
- that.goodsDetail.stock_warning = res.data.detail.stock_warning
- if (that.goodsDetail.stock_warning || that.goodsDetail.stock_warning == 0) {
- that.goodsDetail.stock_warning_switch = true
- }
- return false;
- })
- },
- submitForm(formName) {
- this.$refs[formName].validate((valid) => {
- if (valid) {
- let that = this;
- let arrForm = JSON.parse(JSON.stringify(that.goodsDetail));
- let params_arrflg = true;
- arrForm.params_arr.forEach(i => {
- for (key in i) {
- if (!i[key]) {
- params_arrflg = false;
- }
- }
- })
- if (!params_arrflg) {
- Toastr.error('参数详情未填写完整');
- return false;
- }
- arrForm.params = JSON.stringify(arrForm.params_arr);
- arrForm.content = $("#c-content").val();
-
- var arrids = []
- // 发货模板id
- if (arrForm.type == 'normal') {
- if (arrForm.dispatch_type.indexOf('express') != -1 && arrForm.express_ids != '') {
- arrids.push(arrForm.express_ids);
- }
- if (arrForm.dispatch_type.indexOf('store') != -1 && arrForm.store_ids != '') {
- arrids.push(arrForm.store_ids);
- }
- if (arrForm.dispatch_type.indexOf('selfetch') != -1 && arrForm.selfetch_ids != '') {
- arrids.push(arrForm.selfetch_ids);
- }
- arrForm.dispatch_ids = arrids.join(",")
- } else {
- if (arrForm.dispatch_type == 'selfetch' && arrForm.selfetch_ids != '') {
- arrids = []
- arrids.push(arrForm.selfetch_ids);
- } else if (arrForm.dispatch_type == 'autosend' && arrForm.autosend_ids != '') {
- arrids = []
- arrids.push(arrForm.autosend_ids);
- }
- }
- arrForm.dispatch_ids = arrids.join(",")
- that.mustDel.forEach(i => {
- delete arrForm[i]
- })
- let submitSkuList = []
- let submitSkuPrice = []
- if (arrForm.is_sku == 0) {
- // 库存预警
- if (!arrForm.stock_warning_switch) {
- arrForm.stock_warning = null;
- }
- delete arrForm.stock_warning_switch
- } else {
- submitSkuList = JSON.parse(JSON.stringify(that.skuList))
- submitSkuPrice = JSON.parse(JSON.stringify(that.skuPrice))
- submitSkuPrice.forEach(s => {
- if (!s.stock_warning_switch) {
- s.stock_warning = null
- }
- delete s.stock_warning_switch
- })
- }
- if (that.editId && that.type == 'edit') {
- Fast.api.ajax({
- url: 'shopro/goods/goods/edit/ids/' + that.editId,
- loading: true,
- data: {
- row: arrForm,
- sku: {
- listData: JSON.stringify(submitSkuList),
- priceData: JSON.stringify(submitSkuPrice)
- }
- }
- }, function (ret, res) {
- Fast.api.close();
- })
- } else {
- if (this.type == 'copy') {
- delete arrForm.id
- }
- Fast.api.ajax({
- url: 'shopro/goods/goods/add',
- loading: true,
- data: {
- row: arrForm,
- sku: {
- listData: JSON.stringify(submitSkuList),
- priceData: JSON.stringify(submitSkuPrice)
- }
- }
- }, function (ret, res) {
- Fast.api.close();
- })
- }
- } else {
- return false;
- }
- });
- },
- resetForm(formName) {
- this.$refs[formName].resetFields();
- },
- addImg(type, index, multiple) {
- let that = this;
- parent.Fast.api.open("general/attachment/select?multiple=" + multiple, "选择图片", {
- callback: function (data) {
- switch (type) {
- case "image":
- that.goodsDetail.image = data.url;
- break;
- case "images":
- that.goodsDetail.images = that.goodsDetail.images ? that.goodsDetail.images + ',' + data.url : data.url;
- let arrs = that.goodsDetail.images.split(',');
- if (arrs.length > 9) {
- that.timeData.images_arr = arrs.slice(-9)
- } else {
- that.timeData.images_arr = arrs
- }
- that.goodsDetail.images = that.timeData.images_arr.join(',');
- break;
- case "sku":
- that.skuPrice[index].image = data.url;
- break;
- }
- }
- });
- return false;
- },
- delImg(type, index) {
- let that = this;
- switch (type) {
- case "image":
- that.goodsDetail.image = '';
- break;
- case "images":
- that.timeData.images_arr.splice(index, 1);
- that.goodsDetail.images = that.timeData.images_arr.join(",");
- break;
- case "sku":
- that.skuPrice[index].image = '';
- break;
- }
- },
- imagesDrag(){
- this.goodsDetail.images = this.timeData.images_arr.join(",");
- },
- changeGoodsType(type) {
- this.goodsDetail.type = type;
- this.goodsDetail.dispatch_ids_arr = [];
- this.goodsDetail.dispatch_ids = '';
- this.goodsDetail.dispatch_type_arr = [];
- this.goodsDetail.dispatch_type = '';
- this.timeData.dispatch_type_arr = []
- this.goodsDetail.express_ids = ''
- this.goodsDetail.store_ids = ''
- this.goodsDetail.selfetch_ids = ''
- },
- categoryChange(val) {
- this.goodsDetail.category_ids = val.join(',');
- },
- serviceChange(val) {
- this.goodsDetail.service_ids = val.join(',');
- },
- dispatchTypeChange(val) {
- this.goodsDetail.dispatch_type = val.join(',');
- },
- dispatchTypeChanger(val) {
- this.goodsDetail.dispatch_type = val;
- this.getDispatchTemplateData(val, 'virtual');
- },
- getDispatchTemplateData(type, fristEdit) {
- let that = this;
- if (this.goodsDetail.dispatch_type.indexOf(type) == -1 || fristEdit == 'edit' || fristEdit == 'virtual' || fristEdit == 'create') {
- Fast.api.ajax({
- url: 'shopro/dispatch/dispatch/select/type/' + type,
- loading: false,
- type: 'GET',
- }, function (ret, res) {
- that.$set(that.dispatchOptions, type, res.data)
- return false;
- })
- }
- },
- getCategoryOptions(form) {
- let that = this;
- Fast.api.ajax({
- url: 'shopro/category/index',
- loading: false,
- }, function (ret, res) {
- that.categoryOptions = res.data;
- if (that.categoryOptions.length > 0) {
- if (that.activeName && that.activeIndex) {
- } else {
- that.activeName = that.categoryOptions[0].name
- that.activeIndex = 0;
- }
- that.categoryOptions.forEach(i => {
- if (i.children && i.children.length > 0) {
- i.children.forEach(j => {
- if (j.children && j.children.length > 0) {
- j.children.forEach(k => {
- if (k.children && k.children.length > 0) {
- k.children.forEach(g => {
- })
- } else {
- delete k.children;
- }
- })
- } else {
- delete j.children;
- }
- })
- } else {
- delete i.children;
- }
- })
- }
- if (form) {
- that.getEditData()
- }
- return false;
- })
- },
- getDispatchType() {
- let that = this;
- Fast.api.ajax({
- url: 'shopro/dispatch/dispatch/typeList',
- loading: false,
- }, function (ret, res) {
- let arr = []
- for (key in res.data) {
- arr.push({
- id: key,
- name: res.data[key]
- })
- }
- that.dispatchType = arr;
- return false;
- })
- },
- getServiceOptions() {
- let that = this;
- Fast.api.ajax({
- url: 'shopro/goods/service/all',
- loading: false,
- }, function (ret, res) {
- that.serviceOptions = res.data
- return false;
- })
- },
- gotoback(formName) {
- this.$refs[formName].validate((valid) => {
- if (valid) {
- this.stepActive++;
- } else {
- return false;
- }
- });
- },
- gonextback() {
- this.stepActive--;
- },
- addParams() {
- this.goodsDetail.params_arr.push({
- title: '',
- content: ''
- })
- },
- delParams(index) {
- this.goodsDetail.params_arr.splice(index, 1)
- },
- //添加主规格
- addMainSku() {
- // if (this.skuModal !== '') {
- this.skuList.push({
- id: 0,
- temp_id: this.countId++,
- name: this.skuModal,
- pid: 0,
- children: []
- })
- this.skuModal = '';
- // this.skuPrice = [] // 新添加的主规格不清空 skuPrice,当添加主规格第一个子规格的时候清空
- this.buildSkuPriceTable()
- // }
- },
- //添加子规格
- addChildrenSku(k) {
- // if (this.childrenModal[k] !== '') {
- // 检测当前子规格是否已经被添加过了
- let isExist = false
- this.skuList[k].children.forEach(e => {
- if (e.name == this.childrenModal[k] && e.name != "") {
- isExist = true
- }
- })
- if (isExist) {
- Toastr.error('子规格已存在');
- return false;
- }
- this.skuList[k].children.push({
- id: 0,
- temp_id: this.countId++,
- name: this.childrenModal[k],
- pid: this.skuList[k].id,
- })
- this.childrenModal[k] = '';
- // 如果是添加的第一个子规格,清空 skuPrice
- if (this.skuList[k].children.length == 1) {
- this.skuPrice = [] // 规格大变化,清空skuPrice
- this.isResetSku = 1; // 重置规格
- }
- this.buildSkuPriceTable()
- // }
- },
- //删除主规格
- deleteMainSku(k) {
- let data = this.skuList[k]
- // 删除主规格
- this.skuList.splice(k, 1)
- // 如果当前删除的主规格存在子规格,则清空 skuPrice, 不存在子规格则不清空
- if (data.children.length > 0) {
- this.skuPrice = [] // 规格大变化,清空skuPrice
- this.isResetSku = 1; // 重置规格
- }
- this.buildSkuPriceTable()
- },
- //删除子规格
- deleteChildrenSku(k, i) {
- let data = this.skuList[k].children[i]
- this.skuList[k].children.splice(i, 1)
- // 查询 skuPrice 中包含被删除的的子规格的项,然后移除
- let deleteArr = []
- this.skuPrice.forEach((item, index) => {
- item.goods_sku_text.forEach((e, i) => {
- if (e == data.name) {
- deleteArr.push(index)
- }
- })
- })
- deleteArr.sort(function (a, b) {
- return b - a;
- })
- // 移除有相关子规格的项
- deleteArr.forEach((i, e) => {
- this.skuPrice.splice(i, 1)
- })
- // 当前规格项,所有子规格都被删除,清空 skuPrice
- if (this.skuList[k].children.length <= 0) {
- this.skuPrice = [] // 规格大变化,清空skuPrice
- this.isResetSku = 1; // 重置规格
- }
- this.buildSkuPriceTable()
- },
- editStatus(i) {
- if (this.skuPrice[i].status == 'up') {
- this.skuPrice[i].status = 'down'
- } else {
- this.skuPrice[i].status = 'up'
- }
- },
- //组合新的规格价格库存重量编码图片
- buildSkuPriceTable() {
- let arr = [];
- //遍历sku子规格生成新数组,然后执行递归笛卡尔积
- this.skuList.forEach((s1, k1) => {
- let children = s1.children;
- let childrenIdArray = [];
- if (children.length > 0) {
- children.forEach((s2, k2) => {
- childrenIdArray.push(s2.temp_id);
- })
- // 如果 children 子规格数量为 0,则不渲染当前规格, (相当于没有这个主规格)
- arr.push(childrenIdArray);
- }
- })
- this.recursionSku(arr, 0, []);
- },
- //递归找笛卡尔规格集合
- recursionSku(arr, k, temp) {
- if (k == arr.length && k != 0) {
- let tempDetail = []
- let tempDetailIds = []
- temp.forEach((item, index) => {
- for (let sku of this.skuList) {
- for (let child of sku.children) {
- if (item == child.temp_id) {
- tempDetail.push(child.name)
- tempDetailIds.push(child.temp_id)
- }
- }
- }
- })
- let flag = false // 默认添加新的
- for (let i = 0; i < this.skuPrice.length; i++) {
- if (this.skuPrice[i].goods_sku_temp_ids.join(',') == tempDetailIds.join(',')) {
- flag = i
- break;
- }
- }
- if (flag === false) {
- this.skuPrice.push({
- id: 0,
- temp_id: this.skuPrice.length + 1,
- goods_sku_ids: '',
- goods_id: 0,
- weigh: 0,
- image: '',
- stock: 0,
- stock_warning: null,
- stock_warning_switch: false,
- price: 0,
- sn: '',
- weight: 0,
- status: 'up',
- goods_sku_text: tempDetail,
- goods_sku_temp_ids: tempDetailIds,
- });
- } else {
- this.skuPrice[flag].goods_sku_text = tempDetail
- this.skuPrice[flag].goods_sku_temp_ids = tempDetailIds
- }
- return;
- }
- if (arr.length) {
- for (let i = 0; i < arr[k].length; i++) {
- temp[k] = arr[k][i]
- this.recursionSku(arr, k + 1, temp)
- }
- }
- },
- allEditData(type, opt) {
- switch (opt) {
- case 'define':
- this.skuPrice.forEach(i => {
- if (type == 'stock_warning') {
- if (this.allstock_warning_switch) {
- i.stock_warning_switch = true
- if (this.allEditDatas) {
- i[type] = this.allEditDatas
- } else {
- i[type] = 0
- }
- } else {
- i.stock_warning_switch = false
- if (i.stock_warning_switch) {
- i[type] = this.allEditDatas
- } else {
- i[type] = null
- }
- }
- } else {
- i[type] = this.allEditDatas;
- }
- })
- this.allEditDatas = ''
- this.allEditPopover[type] = false;
- this.allstock_warning_switch = false;
- break;
- case 'cancel':
- this.allEditDatas = ''
- this.allEditPopover[type] = false;
- this.allstock_warning_switch = false;
- break;
- }
- },
- changeStockWarningSwitch(type, index) {
- // 0是单规格 1是多规格
- if (type == 0) {
- this.goodsDetail.stock_warning = this.goodsDetail.stock_warning_switch ? 0 : null
- } else if (type == 1) {
- this.skuPrice[index].stock_warning = this.skuPrice[index].stock_warning_switch ? 0 : null
- }
- }
- },
- watch: {
- stepActive(newVal) {
- this.editor = null;
- },
- skuList: {
- handler(newName, oldName) {
- if (this.isEditInit) { // 编辑初始化的时候会修改 skuList 但这时候不触发更新
- this.buildSkuPriceTable();
- }
- },
- deep: true
- }
- },
- })
- }
- };
- return Controller;
- });
|