commit
b5046f3f57
66 changed files with 11826 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
coverage |
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"extends": "eslint-config-egg", |
||||
|
"root": true |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
logs/ |
||||
|
npm-debug.log |
||||
|
yarn-error.log |
||||
|
node_modules/ |
||||
|
*-lock.json |
||||
|
*-lock.yaml |
||||
|
yarn.lock |
||||
|
coverage/ |
||||
|
.idea/ |
||||
|
run/ |
||||
|
.DS_Store |
||||
|
*.sw* |
||||
|
*.un~ |
||||
|
typings/ |
||||
|
.nyc_output/ |
@ -0,0 +1,31 @@ |
|||||
|
# back |
||||
|
|
||||
|
back |
||||
|
|
||||
|
## QuickStart |
||||
|
|
||||
|
<!-- add docs here for user --> |
||||
|
|
||||
|
see [egg docs][egg] for more detail. |
||||
|
|
||||
|
### Development |
||||
|
|
||||
|
```bash |
||||
|
npm i |
||||
|
npm run dev |
||||
|
open http://localhost:7001/ |
||||
|
``` |
||||
|
|
||||
|
### Deploy |
||||
|
|
||||
|
```bash |
||||
|
npm start |
||||
|
npm stop |
||||
|
``` |
||||
|
|
||||
|
### npm scripts |
||||
|
|
||||
|
- Use `npm run lint` to check code style. |
||||
|
- Use `npm test` to run unit test. |
||||
|
|
||||
|
[egg]: https://eggjs.org |
@ -0,0 +1,17 @@ |
|||||
|
// agent.js
|
||||
|
module.exports = agent => { |
||||
|
// 在这里写你的初始化逻辑。
|
||||
|
|
||||
|
// 你还可以通过 messenger 对象发送消息给 App Worker。
|
||||
|
// 但是,需要等 App Worker 启动成功后才能发送,否则可能丢失消息。
|
||||
|
agent.messenger.on('egg-ready', () => { |
||||
|
// let params = {
|
||||
|
// subType: "add",
|
||||
|
// name: "admin",
|
||||
|
// password: md5("admin"),
|
||||
|
// email: "admin@admin.com",
|
||||
|
// allowRegist: true,
|
||||
|
// }
|
||||
|
// agent.messenger.sendToApp('createAdmin', params);
|
||||
|
}); |
||||
|
}; |
@ -0,0 +1,47 @@ |
|||||
|
// app.js
|
||||
|
class AppBootHook { |
||||
|
constructor(app) { |
||||
|
this.app = app; |
||||
|
} |
||||
|
|
||||
|
configWillLoad() { |
||||
|
// 此时 config 文件已经被读取并合并,但还并未生效
|
||||
|
// 这是应用层修改配置的最后机会
|
||||
|
// 注意:此函数只支持同步调用
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
async didLoad() { |
||||
|
// 所有配置已经加载完毕
|
||||
|
// 可以用来加载应用自定义的文件,启动自定义服务
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
async willReady() { |
||||
|
// 所有插件已启动完毕,但应用整体尚未 ready
|
||||
|
// 可进行数据初始化等操作,这些操作成功后才启动应用
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
async didReady() { |
||||
|
// 应用已启动完毕
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
async serverDidReady() { |
||||
|
// // http/https 服务器已启动,开始接收外部请求
|
||||
|
// // 此时可以从 app.server 获取 server 实例
|
||||
|
// const ctx = await this.app.createAnonymousContext();
|
||||
|
// this.app.messenger.on('createAdmin', async params => {
|
||||
|
// let res = await ctx.model.User.find({ name: params.name });
|
||||
|
// if (!res.length) {
|
||||
|
// await ctx.service.user.index(params)
|
||||
|
// }
|
||||
|
// });
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = AppBootHook; |
@ -0,0 +1,10 @@ |
|||||
|
const { Controller } = require('egg'); |
||||
|
|
||||
|
class ChanpinController extends Controller { |
||||
|
async index() { |
||||
|
const { ctx } = this; |
||||
|
ctx.body = await ctx.service.chanpin.index(ctx.request.body) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ChanpinController; |
@ -0,0 +1,10 @@ |
|||||
|
const { Controller } = require('egg'); |
||||
|
|
||||
|
class DingdanController extends Controller { |
||||
|
async index() { |
||||
|
const { ctx } = this; |
||||
|
ctx.body = await ctx.service.dingdan.index(ctx.request.body) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = DingdanController; |
@ -0,0 +1,10 @@ |
|||||
|
const { Controller } = require('egg'); |
||||
|
|
||||
|
class ExportDataController extends Controller { |
||||
|
async index() { |
||||
|
const { ctx } = this; |
||||
|
ctx.body = await ctx.service.exportData.index(ctx.request.body) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ExportDataController; |
@ -0,0 +1,10 @@ |
|||||
|
const { Controller } = require('egg'); |
||||
|
|
||||
|
class UserController extends Controller { |
||||
|
async index() { |
||||
|
const { ctx } = this; |
||||
|
ctx.body = await ctx.service.user.index(ctx.request.body) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = UserController; |
@ -0,0 +1,606 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
module.exports = app => { |
||||
|
const mongoose = app.mongoose; |
||||
|
const Schema = mongoose.Schema; |
||||
|
|
||||
|
const ChanpinSchema = new Schema({ |
||||
|
// 创建时间
|
||||
|
create_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 更新时间
|
||||
|
update_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 代码
|
||||
|
daima: { |
||||
|
type: String, |
||||
|
default: "", |
||||
|
index: true, |
||||
|
unique: true |
||||
|
}, |
||||
|
// 品名
|
||||
|
pinming: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 规格型号
|
||||
|
guigexinghao: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 助记符
|
||||
|
zhujifu: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 计量单位
|
||||
|
jiliangdanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 条形码
|
||||
|
tiaoxingma: { |
||||
|
type: String, |
||||
|
default: "", |
||||
|
index: true, |
||||
|
}, |
||||
|
// 箱装量
|
||||
|
xiangzhuangliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱装单位
|
||||
|
xiangzhuangdanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 最大单位箱装量
|
||||
|
zuidadanweixiangzhuangliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大箱装单位
|
||||
|
zuidaxiangzhuangdanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 产地
|
||||
|
chandi: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 主供应商
|
||||
|
zhugongyingshang: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 经销商
|
||||
|
jingxiaoshang: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 所属类别
|
||||
|
suoshuleibie: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 最高采购价
|
||||
|
zuigaocaigoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 商超价1
|
||||
|
shangchaojia1: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 现金价
|
||||
|
xianjinjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 二批流通价
|
||||
|
erpiliutongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 商超价
|
||||
|
shangchaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 现金零售价
|
||||
|
xianjinlingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 商超零售价
|
||||
|
shangchaolingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 特通价
|
||||
|
tetongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 分公司价
|
||||
|
fengongsijia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 零食店价
|
||||
|
shangchaolingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 初中高中价
|
||||
|
chuzhonggaozhongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 车销价
|
||||
|
chexiaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 发货价11
|
||||
|
shangchaolingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 发货价12
|
||||
|
fahuojia12: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 进货税率%
|
||||
|
jinhuoshuilv: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 发货税率%
|
||||
|
fahuoshuilv: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 包装
|
||||
|
baozhuang: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 毛利率
|
||||
|
maolilv: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 主存放仓库
|
||||
|
zhucunfangcangku: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 有保质期
|
||||
|
youbaozhiqi: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 保质期(天)
|
||||
|
baozhiqi: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 有效?
|
||||
|
youxiao: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 采销类型
|
||||
|
caixiaoleixing: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 商品类型
|
||||
|
shangpinleixing: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 备注
|
||||
|
beizhu: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 单位重量
|
||||
|
danweizhongliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 品牌
|
||||
|
pinpai: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 单位体积(立方米)
|
||||
|
danweitiji: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱重量(kg)
|
||||
|
xiangzhongliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位重量(kg)
|
||||
|
zuidadanweizhongliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱体积(立方米)
|
||||
|
xiangtiji: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位体积(立方米)
|
||||
|
zuidadanweitiji: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 描述
|
||||
|
miaoshu: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 仓库出入库时,以‘箱装单位’为依准
|
||||
|
yixiangzhuangdanweiweiyizhun: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 打印‘流通随行单’
|
||||
|
liutongsuixingdan: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 发货产品
|
||||
|
fahuochanpin: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 标准核算价
|
||||
|
biaozhunhesuanjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 建议零售价
|
||||
|
jianyilingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最近一次采购价
|
||||
|
zuijinyicicaigoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最近一次销售价
|
||||
|
zuijinyicixiaoshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱条形码
|
||||
|
xiangtiaoxingma: { |
||||
|
type: String, |
||||
|
default: "", |
||||
|
index: true, |
||||
|
}, |
||||
|
// 最大箱装条码
|
||||
|
zuidaxiangzhuangtiaoma: { |
||||
|
type: String, |
||||
|
default: "", |
||||
|
index: true, |
||||
|
}, |
||||
|
// 接口编码1
|
||||
|
jiekoubianma1: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 接口编码2
|
||||
|
jiekoubianma2: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 接口编码3
|
||||
|
jiekoubianma3: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 发货产品基数
|
||||
|
fahuochanpinjishu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 采购最少数量
|
||||
|
caigouzuishaoshuliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 采购倍数
|
||||
|
caigoubeishu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 采购滚动基数
|
||||
|
caigougundongjishu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最小单位产品
|
||||
|
zuixiaodanweichanpin: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 最小单位倍数
|
||||
|
zuixiaodanweibeishu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 产品归类
|
||||
|
chanpinguilei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 产品归类II
|
||||
|
chanpinguilei2: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 箱单位最高采购价
|
||||
|
xiangdanweizuigaocaigoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位商超价1
|
||||
|
xiangdanweishangchaojia1: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位现金价
|
||||
|
xiangdanweixianjinjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位二批流通价
|
||||
|
xiangdanweierpiliutongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位商超价
|
||||
|
xiangdanweishangchaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位现金零售价
|
||||
|
xiangdanweixianjinlingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位商超零售价
|
||||
|
xiangdanweishangchaolingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位特通价
|
||||
|
xiangdanweitetongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位分公司价
|
||||
|
xiangdanweifengongsijia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位零食店价
|
||||
|
xiangdanweilingshidianjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位初中高中价
|
||||
|
xiangdanweichuzhonggaozhongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位车销价
|
||||
|
xiangdanweichexiaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位发货价11
|
||||
|
xiangdanweifahuojia11: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱单位发货价12
|
||||
|
xiangdanweifahuojia12: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位最高采购价
|
||||
|
zuidadanweizuigaocaigoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位商超价1
|
||||
|
zuidadanweishangchaojia1: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位现金价
|
||||
|
zuidadanweixianjinjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位二批流通价
|
||||
|
zuidadanweierpiliutongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位商超价
|
||||
|
zuidadanweishangchaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位现金零售价
|
||||
|
zuidadanweixianjinlingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位商超零售价
|
||||
|
zuidadanweishangchaolingshoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位特通价
|
||||
|
zuidadanweitetongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位分公司价
|
||||
|
zuidadanweifengongsijia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位零食店价
|
||||
|
zuidadanweilingshidianjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位初中高中价
|
||||
|
zuidadanweichuzhonggaozhongjia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位车销价
|
||||
|
zuidadanweichexiaojia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位发货价11
|
||||
|
zuidadanweifahuojia11: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单位发货价12
|
||||
|
zuidadanweifahuojia12: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 默认单据单位
|
||||
|
morendanjudanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 不封箱单位
|
||||
|
bufengxiangdanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 仓库提成类别
|
||||
|
cangkutichengleibie: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 强制批次管理
|
||||
|
qiangzhipiciguanli: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 立库存放区域
|
||||
|
likucunfangquyu: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 建档日期
|
||||
|
jiandangriqi: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 出货是否加工
|
||||
|
chuhuoshifujiagong: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 保质期天数需大于
|
||||
|
baozhiqitianshuxudayu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 单品重量误差
|
||||
|
danpinzhongliangwucha: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大单品重量误差百分比%
|
||||
|
zuidadanpinzhongliangwuchabaifenbi: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大箱重量误差
|
||||
|
zuidaxiangzhongliangwucha: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 价格调整时间
|
||||
|
jiagediaozhengshijian: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 录入人
|
||||
|
lururen: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 允收天数
|
||||
|
yunshoutianshu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 强制序列号管理
|
||||
|
qiangzhixuliehaoguanli: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 国标条形码
|
||||
|
guobiaotiaoxingma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 长(cm)
|
||||
|
chang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 宽(cm)
|
||||
|
kuan: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 高(cm)
|
||||
|
gao: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 每托盘件数
|
||||
|
meituopanjianshu: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
//数据是否删除
|
||||
|
isExit: { |
||||
|
type: Number, |
||||
|
default: 1, |
||||
|
index: true |
||||
|
}, |
||||
|
}, { strict: false }); |
||||
|
return mongoose.model('Chanpin', ChanpinSchema); |
||||
|
}; |
@ -0,0 +1,151 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
module.exports = app => { |
||||
|
const mongoose = app.mongoose; |
||||
|
const Schema = mongoose.Schema; |
||||
|
|
||||
|
const DingdanSchema = new Schema({ |
||||
|
// 创建时间
|
||||
|
create_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 更新时间
|
||||
|
update_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 客户编号
|
||||
|
kehubianhao: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 简称
|
||||
|
username: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 客户名称
|
||||
|
kehumingcheng: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 产品代码
|
||||
|
chanpindaima: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 厂编
|
||||
|
changbian: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 货号
|
||||
|
huohao: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 单据单位数量
|
||||
|
danjudanweishuliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 条码
|
||||
|
tiaoma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 最小单位条码
|
||||
|
zuixiaodanweitiaoma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 修改后销售数量
|
||||
|
xiugaihouxiaoshoushuliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最高采购价
|
||||
|
zuigaocaigoujia: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 箱装量
|
||||
|
xiangzhuangliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 最大箱装量
|
||||
|
zuidaxiangzhuangliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 规格型号
|
||||
|
guigexinghao: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 计量单位
|
||||
|
jiliangdanwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 箱条码
|
||||
|
xiangtiaoma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 最大箱条码
|
||||
|
zuidaxiangtiaoma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 条码
|
||||
|
tiaoma: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 品名
|
||||
|
pinming: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 品名选项
|
||||
|
pinmingxuanxiang: { |
||||
|
type: Array, |
||||
|
default: [] |
||||
|
}, |
||||
|
// 单位
|
||||
|
danwei: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 规格
|
||||
|
guige: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 销售数量
|
||||
|
xiaoshoushuliang: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
// 销售金额
|
||||
|
xiaoshoujine: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
}, |
||||
|
//是否售卖
|
||||
|
isNotSale: { |
||||
|
type: Boolean, |
||||
|
default: true, |
||||
|
}, |
||||
|
//数据是否删除
|
||||
|
isExit: { |
||||
|
type: Number, |
||||
|
default: 1, |
||||
|
index: true |
||||
|
}, |
||||
|
}, { strict: false }); |
||||
|
return mongoose.model('Dingdan', DingdanSchema); |
||||
|
}; |
@ -0,0 +1,50 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const { uniq } = require("lodash"); |
||||
|
|
||||
|
module.exports = app => { |
||||
|
const mongoose = app.mongoose; |
||||
|
const Schema = mongoose.Schema; |
||||
|
|
||||
|
const UserSchema = new Schema({ |
||||
|
// 创建时间
|
||||
|
create_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 更新时间
|
||||
|
update_at: { |
||||
|
type: Date, |
||||
|
default: Date.now |
||||
|
}, |
||||
|
// 客户编号
|
||||
|
usercode: { |
||||
|
type: Number, |
||||
|
default: 0, |
||||
|
index: true, |
||||
|
unique: true |
||||
|
}, |
||||
|
// 简称
|
||||
|
username: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 业务员
|
||||
|
salesman: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
// 地址
|
||||
|
address: { |
||||
|
type: String, |
||||
|
default: "" |
||||
|
}, |
||||
|
//数据是否删除
|
||||
|
isExit: { |
||||
|
type: Number, |
||||
|
default: 1, |
||||
|
index: true |
||||
|
}, |
||||
|
}, { strict: false }); |
||||
|
return mongoose.model('User', UserSchema); |
||||
|
}; |
@ -0,0 +1,810 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "代码", |
||||
|
"prop": "daima", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名", |
||||
|
"prop": "pinming", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格型号", |
||||
|
"prop": "guigexinghao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "助记符", |
||||
|
"prop": "zhujifu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "计量单位", |
||||
|
"prop": "jiliangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条形码", |
||||
|
"prop": "tiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装量", |
||||
|
"prop": "xiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装单位", |
||||
|
"prop": "xiangzhuangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装量", |
||||
|
"prop": "zuidadanweixiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装单位", |
||||
|
"prop": "zuidaxiangzhuangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产地", |
||||
|
"prop": "chandi", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "主供应商", |
||||
|
"prop": "zhugongyingshang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "经销商", |
||||
|
"prop": "jingxiaoshang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "所属类别", |
||||
|
"prop": "suoshuleibie", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最高采购价", |
||||
|
"prop": "zuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超价1", |
||||
|
"prop": "shangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "现金价", |
||||
|
"prop": "xianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "二批流通价", |
||||
|
"prop": "erpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超价", |
||||
|
"prop": "shangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "现金零售价", |
||||
|
"prop": "xianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超零售价", |
||||
|
"prop": "shangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "特通价", |
||||
|
"prop": "tetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "分公司价", |
||||
|
"prop": "fengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "零食店价", |
||||
|
"prop": "shangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "初中高中价", |
||||
|
"prop": "chuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "车销价", |
||||
|
"prop": "chexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货价11", |
||||
|
"prop": "fahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货价12", |
||||
|
"prop": "fahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "进销税税率%", |
||||
|
"prop": "jinxiaoshuilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货税税率%", |
||||
|
"prop": "fahuoshuilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "包装", |
||||
|
"prop": "baozhuang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "毛利率", |
||||
|
"prop": "maolilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "主存放仓库", |
||||
|
"prop": "zhucunfangcangku", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "有保质期", |
||||
|
"prop": "youbaozhiqi", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "保质期(天)", |
||||
|
"prop": "baozhiqi", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "有效", |
||||
|
"prop": "youxiao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采销类型", |
||||
|
"prop": "caixiaoleixing", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商品类型", |
||||
|
"prop": "shangpinleixing", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "备注", |
||||
|
"prop": "beizhu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位重量", |
||||
|
"prop": "danweizhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品牌", |
||||
|
"prop": "pinpai", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位体积(立方米)", |
||||
|
"prop": "danweitiji", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱重量(kg)", |
||||
|
"prop": "xiangzhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位重量(kg)", |
||||
|
"prop": "zuidadanweizhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱体积(立方米)", |
||||
|
"prop": "xiangtiji", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "描述", |
||||
|
"prop": "miaoshu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "仓库出入库时,以‘箱装单位’为依准", |
||||
|
"prop": "yixiangzhuangdanweiweiyizhun", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "打印‘流通随行单’", |
||||
|
"prop": "liutongsuixingdan", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货产品", |
||||
|
"prop": "fahuochanpin", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "标准核算价", |
||||
|
"prop": "biaozhunhesuanjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "建议零售价", |
||||
|
"prop": "jianyilingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最近一次采购价", |
||||
|
"prop": "zuijinyicicaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最近一次销售价", |
||||
|
"prop": "zuijinyicixiaoshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱条形码", |
||||
|
"prop": "xiangtiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装条码", |
||||
|
"prop": "zuidaxiangzhuangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码1", |
||||
|
"prop": "jiekoubianma1", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码2", |
||||
|
"prop": "jiekoubianma2", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码3", |
||||
|
"prop": "jiekoubianma3", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货产品基数", |
||||
|
"prop": "fahuochanpinjishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购最少数量", |
||||
|
"prop": "caigouzuishaoshuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购倍数", |
||||
|
"prop": "caigoubeishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购滚动基数", |
||||
|
"prop": "caigougundongjishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位产品", |
||||
|
"prop": "zuixiaodanweichanpin", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位倍数", |
||||
|
"prop": "zuixiaodanweibeishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品归类", |
||||
|
"prop": "chanpinguilei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品归类II", |
||||
|
"prop": "chanpinguilei2", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位最高采购价", |
||||
|
"prop": "xiangdanweizuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超价1", |
||||
|
"prop": "xiangdanweishangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位现金价", |
||||
|
"prop": "xiangdanweixianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位二批流通价", |
||||
|
"prop": "xiangdanweierpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超价", |
||||
|
"prop": "xiangdanweishangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位现金零售价", |
||||
|
"prop": "xiangdanweixianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超零售价", |
||||
|
"prop": "xiangdanweishangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位特通价", |
||||
|
"prop": "xiangdanweitetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位分公司价", |
||||
|
"prop": "xiangdanweifengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位零食店价", |
||||
|
"prop": "xiangdanweilingshidianjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位初中高中价", |
||||
|
"prop": "xiangdanweichuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位车销价", |
||||
|
"prop": "xiangdanweichexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位发货价11", |
||||
|
"prop": "xiangdanweifahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位发货价12", |
||||
|
"prop": "xiangdanweifahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位最高采购价", |
||||
|
"prop": "zuidadanweizuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超价1", |
||||
|
"prop": "zuidadanweishangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位现金价", |
||||
|
"prop": "zuidadanweixianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位二批流通价", |
||||
|
"prop": "zuidadanweierpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超价", |
||||
|
"prop": "zuidadanweishangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位现金零售价", |
||||
|
"prop": "zuidadanweixianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超零售价", |
||||
|
"prop": "zuidadanweishangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位特通价", |
||||
|
"prop": "zuidadanweitetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位分公司价", |
||||
|
"prop": "zuidadanweifengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位零食店价", |
||||
|
"prop": "zuidadanweilingshidianjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位初中高中价", |
||||
|
"prop": "zuidadanweichuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位车销价", |
||||
|
"prop": "zuidadanweichexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位发货价11", |
||||
|
"prop": "zuidadanweifahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位发货价12", |
||||
|
"prop": "zuidadanweifahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "默认单据单位", |
||||
|
"prop": "morendanjudanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "不封箱单位", |
||||
|
"prop": "bufengxiangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "仓库提成类别", |
||||
|
"prop": "cangkutichengleibie", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "强制批次管理", |
||||
|
"prop": "qiangzhipiciguanli", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "立库存放区域", |
||||
|
"prop": "likucunfangquyu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "建档日期", |
||||
|
"prop": "jiandangriqi", |
||||
|
"type": "date", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "出货是否加工", |
||||
|
"prop": "chuhuoshifujiagong", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "保质期天数需大于", |
||||
|
"prop": "baozhiqitianshuxudayu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单品重量误差", |
||||
|
"prop": "danpinzhongliangwucha", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单品重量误差百分比%", |
||||
|
"prop": "zuidazhongliangwuchabaifenbi", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱重量误差", |
||||
|
"prop": "zuidaxiangzhongliangwucha", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "价格调整时间", |
||||
|
"prop": "jiagediaozhengshijian", |
||||
|
"type": "date", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "录入人", |
||||
|
"prop": "lururen", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "允收天数", |
||||
|
"prop": "yunshoutianshu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "强制序列号管理", |
||||
|
"prop": "qiangzhixuliehaoguanli", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "国标条形码", |
||||
|
"prop": "guobiaotiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "长(cm)", |
||||
|
"prop": "chang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "宽(cm)", |
||||
|
"prop": "kuan", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "高(cm)", |
||||
|
"prop": "gao", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "每托盘件数", |
||||
|
"prop": "meituopanjianshu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,180 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户编号", |
||||
|
"prop": "kehubianhao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "简称", |
||||
|
"prop": "username", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户名称", |
||||
|
"prop": "kehumingcheng", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品代码", |
||||
|
"prop": "chanpindaima", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "厂编", |
||||
|
"prop": "changbian", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "货号", |
||||
|
"prop": "huohao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单据单位数量", |
||||
|
"prop": "danjudanweishuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条码", |
||||
|
"prop": "tiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位条码", |
||||
|
"prop": "zuixiaodanweitiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "修改后销售数量", |
||||
|
"prop": "xiugaihouxiaoshoushuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最高采购价", |
||||
|
"prop": "zuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装量", |
||||
|
"prop": "xiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装量", |
||||
|
"prop": "zuidaxiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格型号", |
||||
|
"prop": "guigexinghao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "计量单位", |
||||
|
"prop": "jiliangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱条码", |
||||
|
"prop": "xiangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱条码", |
||||
|
"prop": "zuidaxiangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条码", |
||||
|
"prop": "tiaoma", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名", |
||||
|
"prop": "pinming", |
||||
|
"type": "select", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名选项", |
||||
|
"prop": "pinmingxuanxiang", |
||||
|
"type": "textoption", |
||||
|
"formShow": false, |
||||
|
"tableShow": false |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位", |
||||
|
"prop": "danwei", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格", |
||||
|
"prop": "guige", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "销售数量", |
||||
|
"prop": "xiaoshoushuliang", |
||||
|
"type": "number", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "销售金额", |
||||
|
"prop": "xiaoshoujine", |
||||
|
"type": "number", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,40 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户编号", |
||||
|
"prop": "usercode", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "简称", |
||||
|
"prop": "username", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "业务员", |
||||
|
"prop": "salesman", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "地址", |
||||
|
"prop": "address", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,11 @@ |
|||||
|
/** |
||||
|
* @param {Egg.Application} app - egg application |
||||
|
*/ |
||||
|
module.exports = app => { |
||||
|
const { router, controller } = app; |
||||
|
router.post('/api/userInfo', controller.user.index); |
||||
|
router.post('/api/chanpinInfo', controller.chanpin.index); |
||||
|
router.post('/api/dingdanInfo', controller.dingdan.index); |
||||
|
router.post('/api/exportDingdanInfo', controller.exportData.index); |
||||
|
|
||||
|
}; |
@ -0,0 +1,67 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Service = require('egg').Service; |
||||
|
const _ = require("lodash") |
||||
|
class ChanpinService extends Service { |
||||
|
async index(params) { |
||||
|
let { ctx } = this |
||||
|
let modelLocal = ctx.model.Chanpin |
||||
|
let returnData = { hasError: false, msg: "数据错误", list: [] } |
||||
|
//新增
|
||||
|
let subType = params.subType |
||||
|
let returnComponent = params.returnData || [] |
||||
|
let paramsLocal = _.omit(params, ["subType", "returnData", "url"]) |
||||
|
if (subType === "add") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.create(paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据新增成功" |
||||
|
} else if (subType === "multi") { |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.insertMany(paramsLocal.list) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "批量新增成功" |
||||
|
} else if (subType === "del") { |
||||
|
let res = await modelLocal.updateMany({ _id: { $in: paramsLocal.ids } }, { isExit: 0, update_at: Date.now() }) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据删除成功" |
||||
|
} else if (subType === "edit") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.updateOne({ _id: paramsLocal._id }, paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据更新成功" |
||||
|
} else if (subType === "get") { |
||||
|
let pageSize = paramsLocal.pageSize |
||||
|
let currentPage = paramsLocal.currentPage |
||||
|
let paramsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url"]) |
||||
|
let paramsLocalInfoNotDel = { ...paramsLocalInfo, isExit: 1 } |
||||
|
let res = await modelLocal.find(paramsLocalInfoNotDel).sort({ update_at: -1 }).skip((currentPage - 1) * pageSize).limit(pageSize) |
||||
|
let resData = []; |
||||
|
for (let i = 0; i < res.length; i++) { |
||||
|
let elei = res[i]; |
||||
|
let resObj = { _id: elei._id } |
||||
|
if (returnComponent.length) { |
||||
|
for (let j = 0; j < returnComponent.length; j++) { |
||||
|
let elej = returnComponent[j]; |
||||
|
resObj[elej] = elei[elej] |
||||
|
} |
||||
|
} else { |
||||
|
resObj = elei |
||||
|
} |
||||
|
resData.push(resObj) |
||||
|
} |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "查询成功" |
||||
|
returnData.list = resData |
||||
|
} |
||||
|
let allParamsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url", "list", "update_at"]) |
||||
|
let allParamsLocalInfoNotDel = { ...allParamsLocalInfo, isExit: 1 } |
||||
|
let count = await modelLocal.find(allParamsLocalInfoNotDel).count() |
||||
|
returnData["count"] = count |
||||
|
return returnData |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ChanpinService; |
@ -0,0 +1,191 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Service = require('egg').Service; |
||||
|
const _ = require("lodash"); |
||||
|
class DingdanService extends Service { |
||||
|
async index(params) { |
||||
|
let { ctx } = this |
||||
|
let modelLocal = ctx.model.Dingdan |
||||
|
let chanpinModel = ctx.model.Chanpin |
||||
|
let returnData = { hasError: false, msg: "数据错误", list: [] } |
||||
|
//新增
|
||||
|
let subType = params.subType |
||||
|
let returnComponent = params.returnData || [] |
||||
|
let paramsLocal = _.omit(params, ["subType", "returnData", "url"]) |
||||
|
if (subType === "add") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.create(paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据新增成功" |
||||
|
} else if (subType === "multi") { |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let list = await this.dealList(paramsLocal.list) |
||||
|
let res = await modelLocal.insertMany(list) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "批量新增成功" |
||||
|
} else if (subType === "del") { |
||||
|
await modelLocal.updateMany({ _id: { $in: paramsLocal.ids } }, { isExit: 0, update_at: Date.now() }) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据删除成功" |
||||
|
} else if (subType === "edit") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let chanpinItemA = await chanpinModel.find({ tiaoxingma: paramsLocal.tiaoma }) |
||||
|
let chanpinItemB = await chanpinModel.find({ xiangtiaoxingma: paramsLocal.tiaoma }) |
||||
|
let chanpinItemC = await chanpinModel.find({ zuidaxiangzhuangtiaoma: paramsLocal.tiaoma }) |
||||
|
if (chanpinItemA.length || chanpinItemB.length || chanpinItemC.length) { |
||||
|
paramsLocal = { ...paramsLocal, isNotSale: false } |
||||
|
let res = await modelLocal.updateOne({ _id: paramsLocal._id }, paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据更新成功" |
||||
|
} else { |
||||
|
returnData.hasError = true |
||||
|
returnData.msg = "数据更新失败,请检查产品条形码是否填写正确" |
||||
|
} |
||||
|
} else if (subType === "get") { |
||||
|
let pageSize = paramsLocal.pageSize |
||||
|
let currentPage = paramsLocal.currentPage |
||||
|
let paramsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url"]) |
||||
|
let paramsLocalInfoNotDel = { ...paramsLocalInfo, isExit: 1 } |
||||
|
let res = await modelLocal.find(paramsLocalInfoNotDel).sort({ update_at: -1 }).skip((currentPage - 1) * pageSize).limit(pageSize) |
||||
|
let resData = []; |
||||
|
for (let i = 0; i < res.length; i++) { |
||||
|
let elei = res[i]; |
||||
|
let resObj = { _id: elei._id } |
||||
|
if (returnComponent.length) { |
||||
|
for (let j = 0; j < returnComponent.length; j++) { |
||||
|
let elej = returnComponent[j]; |
||||
|
resObj[elej] = elei[elej] |
||||
|
} |
||||
|
} else { |
||||
|
resObj = elei |
||||
|
} |
||||
|
resData.push(resObj) |
||||
|
} |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "查询成功" |
||||
|
returnData.list = resData |
||||
|
} |
||||
|
let allParamsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url"]) |
||||
|
let allParamsLocalInfoNotDel = { ...allParamsLocalInfo, isExit: 1 } |
||||
|
let count = await modelLocal.find(allParamsLocalInfoNotDel).count() |
||||
|
returnData["count"] = count |
||||
|
return returnData |
||||
|
} |
||||
|
async dealList(list) { |
||||
|
let { ctx } = this |
||||
|
let listLocal = [] |
||||
|
let listCopy = _.cloneDeep(list) |
||||
|
let pinmingGroup = _.groupBy(listCopy, o => o.tiaoma) |
||||
|
let pinmingOptionObj = {} |
||||
|
for (let key in pinmingGroup) { |
||||
|
let value = pinmingGroup[key] |
||||
|
let pinmingxuxnaing = [] |
||||
|
for (let i = 0; i < value.length; i++) { |
||||
|
let pinmingOptionItem = {} |
||||
|
let element = value[i]; |
||||
|
pinmingOptionItem["key"] = element.pinming |
||||
|
pinmingOptionItem["value"] = element.pinming |
||||
|
pinmingxuxnaing.push(pinmingOptionItem) |
||||
|
} |
||||
|
pinmingOptionObj[key] = pinmingxuxnaing |
||||
|
} |
||||
|
let userModel = ctx.model.User |
||||
|
let chanpinModel = ctx.model.Chanpin |
||||
|
for (let i = 0; i < list.length; i++) { |
||||
|
let item = _.cloneDeep(list[i]); |
||||
|
item["huohao"] = item.tiaoma |
||||
|
item["pinmingxuanxiang"] = pinmingOptionObj[item.tiaoma] |
||||
|
item["danjudanweishuliang"] = item.xiaoshoushuliang |
||||
|
let userItem = await userModel.find({ usercode: item.kehubianhao }) |
||||
|
let chanpinItemA = await chanpinModel.find({ tiaoxingma: item.tiaoma }) |
||||
|
let chanpinItemB = await chanpinModel.find({ xiangtiaoxingma: item.tiaoma }) |
||||
|
let chanpinItemC = await chanpinModel.find({ zuidaxiangzhuangtiaoma: item.tiaoma }) |
||||
|
if (userItem.length) { |
||||
|
item["kehubianhao"] = _.get(userItem, [0, "usercode"], "") |
||||
|
item["username"] = _.get(userItem, [0, "username"], "") |
||||
|
} else { |
||||
|
item["kehubianhao"] = "" |
||||
|
item["username"] = "" |
||||
|
} |
||||
|
if (chanpinItemA.length) { |
||||
|
item["changbian"] = _.get(chanpinItemA, [0, "daima"], "") |
||||
|
item["chanpindaima"] = _.get(chanpinItemA, [0, "daima"], "") |
||||
|
item["zuixiaodanweitiaoma"] = _.get(chanpinItemA, [0, "tiaoxingma"], "") |
||||
|
item["xiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
item.isNotSale = false |
||||
|
let guigexinghao = _.get(chanpinItemA, [0, "guigexinghao"], "") |
||||
|
let guigexinghaoArr = _.split(guigexinghao, "*") |
||||
|
let jishu = Number(guigexinghaoArr[1]) |
||||
|
if (item.xiaoshoushuliang > jishu) { |
||||
|
let count = Math.floor(item.xiaoshoushuliang / jishu) |
||||
|
item["xiugaihouxiaoshoushuliang"] = count * jishu |
||||
|
} else { |
||||
|
item["xiugaihouxiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
} |
||||
|
item["xiaoshoujine"] = item.xiaoshoujine |
||||
|
item["zuigaocaigoujia"] = _.get(chanpinItemA, [0, "zuigaocaigoujia"], "") |
||||
|
item["xiangzhuangliang"] = _.get(chanpinItemA, [0, "xiangzhuangliang"], "") |
||||
|
item["zuidaxiangzhuangliang"] = _.get(chanpinItemA, [0, "zuidadanweixiangzhuangliang"], "") |
||||
|
item["guigexinghao"] = _.get(chanpinItemA, [0, "guigexinghao"], "") |
||||
|
item["jiliangdanwei"] = _.get(chanpinItemA, [0, "jiliangdanwei"], "") |
||||
|
item["xiangtiaoma"] = _.get(chanpinItemA, [0, "xiangtiaoxingma"], "") |
||||
|
item["zuidaxiangtiaoma"] = _.get(chanpinItemA, [0, "zuidaxiangzhuangtiaoma"], "") |
||||
|
} else if (chanpinItemB.length) { |
||||
|
item["changbian"] = _.get(chanpinItemB, [0, "daima"], "") |
||||
|
item["chanpindaima"] = _.get(chanpinItemB, [0, "daima"], "") |
||||
|
item["zuixiaodanweitiaoma"] = _.get(chanpinItemB, [0, "tiaoxingma"], "") |
||||
|
item["xiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
let guigexinghao = _.get(chanpinItemB, [0, "guigexinghao"], "") |
||||
|
let guigexinghaoArr = _.split(guigexinghao, "*") |
||||
|
let jishu = Number(guigexinghaoArr[1]) |
||||
|
item["xiugaihouxiaoshoushuliang"] = item.xiaoshoushuliang * jishu |
||||
|
item["xiaoshoujine"] = item.xiaoshoujine |
||||
|
item["zuigaocaigoujia"] = _.get(chanpinItemB, [0, "zuigaocaigoujia"], "") |
||||
|
item["xiangzhuangliang"] = _.get(chanpinItemB, [0, "xiangzhuangliang"], "") |
||||
|
item["zuidaxiangzhuangliang"] = _.get(chanpinItemB, [0, "zuidadanweixiangzhuangliang"], "") |
||||
|
item["guigexinghao"] = _.get(chanpinItemB, [0, "guigexinghao"], "") |
||||
|
item["jiliangdanwei"] = _.get(chanpinItemB, [0, "jiliangdanwei"], "") |
||||
|
item["xiangtiaoma"] = _.get(chanpinItemB, [0, "xiangtiaoxingma"], "") |
||||
|
item["zuidaxiangtiaoma"] = _.get(chanpinItemB, [0, "zuidaxiangzhuangtiaoma"], "") |
||||
|
} else if (chanpinItemC.length) { |
||||
|
item["changbian"] = _.get(chanpinItemC, [0, "daima"], "") |
||||
|
item["chanpindaima"] = _.get(chanpinItemC, [0, "daima"], "") |
||||
|
item["zuixiaodanweitiaoma"] = _.get(chanpinItemC, [0, "tiaoxingma"], "") |
||||
|
item["xiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
let guigexinghao = _.get(chanpinItemC, [0, "guigexinghao"], "") |
||||
|
let guigexinghaoArr = _.split(guigexinghao, "*") |
||||
|
let jishu = Number(guigexinghaoArr[1]) |
||||
|
item["xiugaihouxiaoshoushuliang"] = item.xiaoshoushuliang * jishu * Number((_.get(chanpinItemC, [0, "xiangzhuangliang"], 1) || 1)) |
||||
|
item["xiaoshoujine"] = item.xiaoshoujine |
||||
|
item["zuigaocaigoujia"] = _.get(chanpinItemC, [0, "zuigaocaigoujia"], "") |
||||
|
item["xiangzhuangliang"] = _.get(chanpinItemC, [0, "xiangzhuangliang"], "") |
||||
|
item["zuidaxiangzhuangliang"] = _.get(chanpinItemC, [0, "zuidadanweixiangzhuangliang"], "") |
||||
|
item["guigexinghao"] = _.get(chanpinItemC, [0, "guigexinghao"], "") |
||||
|
item["jiliangdanwei"] = _.get(chanpinItemC, [0, "jiliangdanwei"], "") |
||||
|
item["xiangtiaoma"] = _.get(chanpinItemC, [0, "xiangtiaoxingma"], "") |
||||
|
item["zuidaxiangtiaoma"] = _.get(chanpinItemC, [0, "zuidaxiangzhuangtiaoma"], "") |
||||
|
} else { |
||||
|
item["changbian"] = "" |
||||
|
item["chanpindaima"] = "" |
||||
|
item["zuixiaodanweitiaoma"] = "" |
||||
|
item["xiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
item["xiugaihouxiaoshoushuliang"] = item.xiaoshoushuliang |
||||
|
item["xiaoshoujine"] = item.xiaoshoujine |
||||
|
item["zuigaocaigoujia"] = "" |
||||
|
item["xiangzhuangliang"] = "" |
||||
|
item["zuidaxiangzhuangliang"] = "" |
||||
|
item["guigexinghao"] = "" |
||||
|
item["jiliangdanwei"] = "" |
||||
|
item["xiangtiaoma"] = "" |
||||
|
item["zuidaxiangtiaoma"] = "" |
||||
|
item.isNotSale = true |
||||
|
} |
||||
|
listLocal.push(item) |
||||
|
} |
||||
|
return listLocal |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = DingdanService; |
@ -0,0 +1,23 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Service = require('egg').Service; |
||||
|
const _ = require("lodash"); |
||||
|
class ExportDataService extends Service { |
||||
|
async index(params) { |
||||
|
let { ctx } = this |
||||
|
let modelLocal = ctx.model[params.model] |
||||
|
let subType = params.subType |
||||
|
let paramsLocal = _.omit(params, ["subType", "url", "model"]) |
||||
|
let msgObj = { |
||||
|
exportS6: "成功导出S6订单", |
||||
|
exportxiaoshou: "成功导出销售订单", |
||||
|
} |
||||
|
let ParamsLocalNotDel = { ...paramsLocal, isExit: 1 } |
||||
|
let res = await modelLocal.find(ParamsLocalNotDel).sort({ update_at: -1 }) |
||||
|
let count = await modelLocal.find(ParamsLocalNotDel).count() |
||||
|
let returnData = { hasError: false, msg: msgObj[subType], subType, list: res, count } |
||||
|
return returnData |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ExportDataService; |
@ -0,0 +1,67 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Service = require('egg').Service; |
||||
|
const _ = require("lodash") |
||||
|
class UserService extends Service { |
||||
|
async index(params) { |
||||
|
let { ctx } = this |
||||
|
let modelLocal = ctx.model.User |
||||
|
let returnData = { hasError: false, msg: "数据错误", list: [] } |
||||
|
//新增
|
||||
|
let subType = params.subType |
||||
|
let returnComponent = params.returnData || [] |
||||
|
let paramsLocal = _.omit(params, ["subType", "returnData", "url"]) |
||||
|
if (subType === "add") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.create(paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据新增成功" |
||||
|
} else if (subType === "multi") { |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.insertMany(paramsLocal.list) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "批量新增成功" |
||||
|
} else if (subType === "del") { |
||||
|
let res = await modelLocal.updateMany({ _id: { $in: paramsLocal.ids } }, { isExit: 0, update_at: Date.now() }) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据删除成功" |
||||
|
} else if (subType === "edit") { |
||||
|
paramsLocal = paramsLocal.list[0] |
||||
|
paramsLocal["update_at"] = Date.now(); |
||||
|
let res = await modelLocal.updateOne({ _id: paramsLocal._id }, paramsLocal) |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "数据更新成功" |
||||
|
} else if (subType === "get") { |
||||
|
let pageSize = paramsLocal.pageSize |
||||
|
let currentPage = paramsLocal.currentPage |
||||
|
let paramsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url"]) |
||||
|
let paramsLocalInfoNotDel = { ...paramsLocalInfo, isExit: 1 } |
||||
|
let res = await modelLocal.find(paramsLocalInfoNotDel).sort({ update_at: -1 }).skip((currentPage - 1) * pageSize).limit(pageSize) |
||||
|
let resData = []; |
||||
|
for (let i = 0; i < res.length; i++) { |
||||
|
let elei = res[i]; |
||||
|
let resObj = { _id: elei._id } |
||||
|
if (returnComponent.length) { |
||||
|
for (let j = 0; j < returnComponent.length; j++) { |
||||
|
let elej = returnComponent[j]; |
||||
|
resObj[elej] = elei[elej] |
||||
|
} |
||||
|
} else { |
||||
|
resObj = elei |
||||
|
} |
||||
|
resData.push(resObj) |
||||
|
} |
||||
|
returnData.hasError = false |
||||
|
returnData.msg = "查询成功" |
||||
|
returnData.list = resData |
||||
|
} |
||||
|
let allParamsLocalInfo = _.omit(paramsLocal, ["pageSize", "currentPage", "url"]) |
||||
|
let allParamsLocalInfoNotDel = { ...allParamsLocalInfo, isExit: 1 } |
||||
|
let count = await modelLocal.find(allParamsLocalInfoNotDel).count() |
||||
|
returnData["count"] = count |
||||
|
return returnData |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = UserService; |
@ -0,0 +1,58 @@ |
|||||
|
/* eslint valid-jsdoc: "off" */ |
||||
|
|
||||
|
/** |
||||
|
* @param {Egg.EggAppInfo} appInfo app info |
||||
|
*/ |
||||
|
module.exports = appInfo => { |
||||
|
/** |
||||
|
* built-in config |
||||
|
* @type {Egg.EggAppConfig} |
||||
|
**/ |
||||
|
const config = exports = {}; |
||||
|
|
||||
|
// use for cookie sign key, should change to your own and keep security
|
||||
|
config.keys = appInfo.name + '_1718796622177_8852'; |
||||
|
|
||||
|
// add your middleware config here
|
||||
|
config.middleware = []; |
||||
|
config.mongoose = { |
||||
|
client: { |
||||
|
url: 'mongodb://127.0.0.1:27018/back', |
||||
|
options: { |
||||
|
// useNewUrlParser: true,
|
||||
|
// useUnifiedTopology: true
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
config.security = { |
||||
|
csrf: { |
||||
|
// 判断是否需要 ignore 的方法,请求上下文 context 作为第一个参数
|
||||
|
// ignore: ctx => isInnerIp(ctx.ip),
|
||||
|
ignore: '/', |
||||
|
}, |
||||
|
}; |
||||
|
config.cors = { |
||||
|
// 任何地址都可以访问
|
||||
|
origin: "*", |
||||
|
// 指定地址才可以访问
|
||||
|
// origin: 'http://localhost:8080',
|
||||
|
// allowMethods: 'GET,PUT,POST,DELETE',
|
||||
|
allowMethods: 'POST', |
||||
|
// cookie跨域配置
|
||||
|
credentials: true |
||||
|
}; |
||||
|
config.bodyParser = { |
||||
|
formLimit: "100mb", |
||||
|
jsonLimit: "100mb", |
||||
|
textLimit: "100mb", |
||||
|
} |
||||
|
// add your user config here
|
||||
|
const userConfig = { |
||||
|
// myAppName: 'egg',
|
||||
|
}; |
||||
|
|
||||
|
return { |
||||
|
...config, |
||||
|
...userConfig, |
||||
|
}; |
||||
|
}; |
@ -0,0 +1,11 @@ |
|||||
|
/** @type Egg.EggPlugin */ |
||||
|
module.exports = { |
||||
|
// had enabled by egg
|
||||
|
// static: {
|
||||
|
// enable: true,
|
||||
|
// }
|
||||
|
mongoose: { |
||||
|
enable: true, |
||||
|
package: 'egg-mongoose', |
||||
|
}, |
||||
|
}; |
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
"include": [ |
||||
|
"**/*" |
||||
|
] |
||||
|
} |
@ -0,0 +1,40 @@ |
|||||
|
{ |
||||
|
"name": "back", |
||||
|
"version": "1.0.0", |
||||
|
"description": "back", |
||||
|
"private": true, |
||||
|
"egg": { |
||||
|
"declarations": true |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"egg": "^3.17.5", |
||||
|
"egg-mongoose": "^4.0.1", |
||||
|
"egg-scripts": "2", |
||||
|
"lodash": "^4.17.21" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"egg-bin": "6", |
||||
|
"egg-mock": "5", |
||||
|
"eslint": "8", |
||||
|
"eslint-config-egg": "13" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=18.0.0" |
||||
|
}, |
||||
|
"scripts": { |
||||
|
"start": "egg-scripts start --daemon --title=egg-server-back", |
||||
|
"stop": "egg-scripts stop --title=egg-server-back", |
||||
|
"dev": "egg-bin dev", |
||||
|
"test": "npm run lint -- --fix && npm run test:local", |
||||
|
"test:local": "egg-bin test", |
||||
|
"cov": "egg-bin cov", |
||||
|
"lint": "eslint .", |
||||
|
"ci": "npm run lint && npm run cov" |
||||
|
}, |
||||
|
"repository": { |
||||
|
"type": "git", |
||||
|
"url": "" |
||||
|
}, |
||||
|
"author": "lichong", |
||||
|
"license": "MIT" |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
const { strict: assert } = require('node:assert'); |
||||
|
const path = require('node:path'); |
||||
|
const { statSync } = require('node:fs'); |
||||
|
const { app } = require('egg-mock/bootstrap'); |
||||
|
|
||||
|
describe('test/app/controller/home.test.js', () => { |
||||
|
it('should assert', async () => { |
||||
|
const pkg = require('../../../package.json'); |
||||
|
assert(app.config.keys.startsWith(pkg.name)); |
||||
|
}); |
||||
|
|
||||
|
it('should typings exists', async () => { |
||||
|
const typings = path.join(__dirname, '../../../typings'); |
||||
|
assert(statSync(typings)); |
||||
|
}); |
||||
|
|
||||
|
it('should GET /', async () => { |
||||
|
return app.httpRequest() |
||||
|
.get('/') |
||||
|
.expect('hi, egg') |
||||
|
.expect(200); |
||||
|
}); |
||||
|
}); |
@ -0,0 +1,9 @@ |
|||||
|
root = true |
||||
|
|
||||
|
[*] |
||||
|
charset = utf-8 |
||||
|
indent_style = space |
||||
|
indent_size = 2 |
||||
|
end_of_line = lf |
||||
|
insert_final_newline = true |
||||
|
trim_trailing_whitespace = true |
@ -0,0 +1,4 @@ |
|||||
|
node_modules |
||||
|
dist |
||||
|
out |
||||
|
*.log* |
@ -0,0 +1 @@ |
|||||
|
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ |
@ -0,0 +1,6 @@ |
|||||
|
out |
||||
|
dist |
||||
|
pnpm-lock.yaml |
||||
|
LICENSE.md |
||||
|
tsconfig.json |
||||
|
tsconfig.*.json |
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"singleQuote": true, |
||||
|
"semi": false, |
||||
|
"printWidth": 100, |
||||
|
"trailingComma": "none" |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
# my-app |
||||
|
|
||||
|
An Electron application with Vue |
||||
|
|
||||
|
## Recommended IDE Setup |
||||
|
|
||||
|
- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) |
||||
|
|
||||
|
## Project Setup |
||||
|
|
||||
|
### Install(node 16.20.1) |
||||
|
|
||||
|
```bash |
||||
|
$ npm install |
||||
|
``` |
||||
|
|
||||
|
### Development |
||||
|
|
||||
|
```bash |
||||
|
$ npm run dev |
||||
|
``` |
||||
|
|
||||
|
### Build |
||||
|
|
||||
|
```bash |
||||
|
# For windows |
||||
|
$ npm run build:win |
||||
|
|
||||
|
# For macOS |
||||
|
$ npm run build:mac |
||||
|
|
||||
|
# For Linux |
||||
|
$ npm run build:linux |
||||
|
``` |
@ -0,0 +1,12 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||
|
<plist version="1.0"> |
||||
|
<dict> |
||||
|
<key>com.apple.security.cs.allow-jit</key> |
||||
|
<true/> |
||||
|
<key>com.apple.security.cs.allow-unsigned-executable-memory</key> |
||||
|
<true/> |
||||
|
<key>com.apple.security.cs.allow-dyld-environment-variables</key> |
||||
|
<true/> |
||||
|
</dict> |
||||
|
</plist> |
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
@ -0,0 +1,36 @@ |
|||||
|
const { notarize } = require('electron-notarize') |
||||
|
|
||||
|
module.exports = async (context) => { |
||||
|
if (process.platform !== 'darwin') return |
||||
|
|
||||
|
console.log('aftersign hook triggered, start to notarize app.') |
||||
|
|
||||
|
if (!process.env.CI) { |
||||
|
console.log(`skipping notarizing, not in CI.`) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) { |
||||
|
console.warn('skipping notarizing, APPLE_ID and APPLE_ID_PASS env variables must be set.') |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
const appId = 'com.electron.app' |
||||
|
|
||||
|
const { appOutDir } = context |
||||
|
|
||||
|
const appName = context.packager.appInfo.productFilename |
||||
|
|
||||
|
try { |
||||
|
await notarize({ |
||||
|
appBundleId: appId, |
||||
|
appPath: `${appOutDir}/${appName}.app`, |
||||
|
appleId: process.env.APPLE_ID, |
||||
|
appleIdPassword: process.env.APPLEIDPASS |
||||
|
}) |
||||
|
} catch (error) { |
||||
|
console.error(error) |
||||
|
} |
||||
|
|
||||
|
console.log(`done notarizing ${appId}.`) |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
appId: com.electron.lichong |
||||
|
productName: 时光机 |
||||
|
directories: |
||||
|
buildResources: build |
||||
|
files: |
||||
|
- '!**/.vscode/*' |
||||
|
- '!src/*' |
||||
|
- '!electron.vite.config.{js,ts,mjs,cjs}' |
||||
|
- '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' |
||||
|
asarUnpack: |
||||
|
- '**/*.{node,dll}' |
||||
|
afterSign: build/notarize.js |
||||
|
win: |
||||
|
executableName: lichong-app |
||||
|
nsis: |
||||
|
oneClick: false |
||||
|
artifactName: ${name}-${version}-setup.${ext} |
||||
|
allowToChangeInstallationDirectory: true |
||||
|
shortcutName: ${productName} |
||||
|
uninstallDisplayName: ${productName} |
||||
|
createDesktopShortcut: always |
||||
|
mac: |
||||
|
entitlementsInherit: build/entitlements.mac.plist |
||||
|
extendInfo: |
||||
|
- NSCameraUsageDescription: Application requests access to the device's camera. |
||||
|
- NSMicrophoneUsageDescription: Application requests access to the device's microphone. |
||||
|
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. |
||||
|
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. |
||||
|
dmg: |
||||
|
artifactName: ${name}-${version}.${ext} |
||||
|
linux: |
||||
|
target: |
||||
|
- AppImage |
||||
|
- snap |
||||
|
- deb |
||||
|
maintainer: electronjs.org |
||||
|
category: Utility |
||||
|
appImage: |
||||
|
artifactName: ${name}-${version}.${ext} |
||||
|
npmRebuild: false |
||||
|
publish: |
||||
|
provider: generic |
||||
|
url: https://example.com/auto-updates |
@ -0,0 +1,28 @@ |
|||||
|
import { resolve } from 'path' |
||||
|
import { defineConfig, externalizeDepsPlugin } from 'electron-vite' |
||||
|
import vue from '@vitejs/plugin-vue' |
||||
|
|
||||
|
export default defineConfig({ |
||||
|
main: { |
||||
|
plugins: [externalizeDepsPlugin()] |
||||
|
}, |
||||
|
preload: { |
||||
|
plugins: [externalizeDepsPlugin()], |
||||
|
build: { |
||||
|
rollupOptions: { |
||||
|
input: { |
||||
|
dl: resolve(__dirname, 'src/preload/dl.js'), |
||||
|
index: resolve(__dirname, 'src/preload/index.js') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
renderer: { |
||||
|
resolve: { |
||||
|
alias: { |
||||
|
'@renderer': resolve('src/renderer/src') |
||||
|
} |
||||
|
}, |
||||
|
plugins: [vue()] |
||||
|
} |
||||
|
}) |
@ -0,0 +1,6 @@ |
|||||
|
{ |
||||
|
"exclude": [ |
||||
|
"node_modules", |
||||
|
"public" |
||||
|
] |
||||
|
} |
File diff suppressed because it is too large
@ -0,0 +1,41 @@ |
|||||
|
{ |
||||
|
"name": "electron", |
||||
|
"version": "1.0.0", |
||||
|
"description": "An Electron application with Vue", |
||||
|
"main": "./out/main/index.js", |
||||
|
"author": "lichong", |
||||
|
"homepage": "https://www.electronjs.org", |
||||
|
"scripts": { |
||||
|
"format": "prettier --write .", |
||||
|
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", |
||||
|
"start": "electron-vite preview", |
||||
|
"dev": "electron-vite dev", |
||||
|
"build": "electron-vite build", |
||||
|
"postinstall": "electron-builder install-app-deps", |
||||
|
"build:win": "npm run build && electron-builder --win --config", |
||||
|
"build:mac": "npm run build && electron-builder --mac --config", |
||||
|
"build:linux": "npm run build && electron-builder --linux --config" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"@electron-toolkit/preload": "^1.0.2", |
||||
|
"@electron-toolkit/utils": "^1.0.2", |
||||
|
"axios": "^1.6.8", |
||||
|
"dayjs": "^1.11.11", |
||||
|
"element-plus": "^2.7.1", |
||||
|
"lodash": "^4.17.21", |
||||
|
"xlsx": "^0.18.5" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@rushstack/eslint-patch": "^1.2.0", |
||||
|
"@vitejs/plugin-vue": "^3.1.2", |
||||
|
"@vue/eslint-config-prettier": "^7.0.0", |
||||
|
"electron": "^20.3.2", |
||||
|
"electron-builder": "^23.6.0", |
||||
|
"electron-notarize": "^1.2.1", |
||||
|
"electron-vite": "^1.0.11", |
||||
|
"less": "^4.1.3", |
||||
|
"prettier": "^2.7.1", |
||||
|
"vite": "^3.1.8", |
||||
|
"vue": "^3.2.41" |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,78 @@ |
|||||
|
import { app, shell, BrowserWindow, nativeImage, ipcMain } from 'electron' |
||||
|
import * as path from 'path' |
||||
|
import { electronApp, optimizer, is } from '@electron-toolkit/utils' |
||||
|
import axios from 'axios' |
||||
|
// logo
|
||||
|
const logoIcon = nativeImage.createFromPath(path.join(__dirname, '../../public/icon/icon.jpg')) |
||||
|
// 主窗口
|
||||
|
let mainWindow |
||||
|
function createWindow() { |
||||
|
mainWindow = new BrowserWindow({ |
||||
|
// fullscreen: true,
|
||||
|
// fullscreenable: true,
|
||||
|
width: 960, |
||||
|
height: 540, |
||||
|
// width:1080,
|
||||
|
// height:1920,
|
||||
|
show: false, |
||||
|
autoHideMenuBar: true, |
||||
|
icon: logoIcon, |
||||
|
webPreferences: { |
||||
|
preload: path.resolve(__dirname, '../preload/index.js'), |
||||
|
sandbox: false, |
||||
|
} |
||||
|
}) |
||||
|
mainWindow.on('ready-to-show', () => { |
||||
|
mainWindow.show() |
||||
|
// mainWindow.webContents.openDevTools()
|
||||
|
}) |
||||
|
mainWindow.webContents.setWindowOpenHandler((details) => { |
||||
|
shell.openExternal(details.url) |
||||
|
return { action: 'deny' } |
||||
|
}) |
||||
|
// mainWindow.loadURL('http://localhost:5173/')
|
||||
|
|
||||
|
mainWindow.on('close', () => { |
||||
|
app.exit() |
||||
|
}) |
||||
|
if (is.dev && process.env['ELECTRON_RENDERER_URL']) { |
||||
|
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) |
||||
|
} else { |
||||
|
mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')) |
||||
|
} |
||||
|
} |
||||
|
app.whenReady().then(() => { |
||||
|
electronApp.setAppUserModelId('com.electron') |
||||
|
// Default open or close DevTools by F12 in development
|
||||
|
// and ignore CommandOrControl + R in production.
|
||||
|
// see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
||||
|
app.on('browser-window-created', (_, window) => { |
||||
|
optimizer.watchWindowShortcuts(window) |
||||
|
}) |
||||
|
createWindow() |
||||
|
|
||||
|
app.on('activate', function () { |
||||
|
// On macOS it's common to re-create a window in the app when the
|
||||
|
// dock icon is clicked and there are no other windows open.
|
||||
|
if (BrowserWindow.getAllWindows().length === 0) createWindow() |
||||
|
}) |
||||
|
ipcMain.on('sendMessage', async (eve, params) => { |
||||
|
let res = await axios.post(`http://127.0.0.1:7001${params.url}`, params) |
||||
|
mainWindow.webContents.send(`${params.url.split("/")[2]}`, res.data) |
||||
|
}) |
||||
|
ipcMain.on('exportData', async (eve, params) => { |
||||
|
let res = await axios.post(`http://127.0.0.1:7001${params.url}`, params) |
||||
|
mainWindow.webContents.send(`${params.model}`, res.data) |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
// Quit when all windows are closed, except on macOS. There, it's common
|
||||
|
// for applications and their menu bar to stay active until the user quits
|
||||
|
// explicitly with Cmd + Q.
|
||||
|
app.on('window-all-closed', () => { |
||||
|
if (process.platform !== 'darwin') { |
||||
|
app.quit() |
||||
|
} |
||||
|
}) |
||||
|
// In this file you can include the rest of your app"s specific main process
|
||||
|
// code. You can also put them in separate files and require them here.
|
@ -0,0 +1,21 @@ |
|||||
|
import { contextBridge, clipboard } from 'electron' |
||||
|
import { electronAPI } from '@electron-toolkit/preload' |
||||
|
|
||||
|
// Custom APIs for renderer
|
||||
|
const api = {} |
||||
|
|
||||
|
// Use `contextBridge` APIs to expose Electron APIs to
|
||||
|
// renderer only if context isolation is enabled, otherwise
|
||||
|
// just add to the DOM global.
|
||||
|
if (process.contextIsolated) { |
||||
|
try { |
||||
|
contextBridge.exposeInMainWorld('electron', electronAPI) |
||||
|
contextBridge.exposeInMainWorld('api', api) |
||||
|
contextBridge.exposeInMainWorld('elecClipboard', clipboard) |
||||
|
} catch (error) { |
||||
|
console.error(error) |
||||
|
} |
||||
|
} else { |
||||
|
window.electron = electronAPI |
||||
|
window.api = api |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
import { contextBridge, clipboard } from 'electron' |
||||
|
import { electronAPI } from '@electron-toolkit/preload' |
||||
|
|
||||
|
// Custom APIs for renderer
|
||||
|
const api = {} |
||||
|
|
||||
|
// Use `contextBridge` APIs to expose Electron APIs to
|
||||
|
// renderer only if context isolation is enabled, otherwise
|
||||
|
// just add to the DOM global.
|
||||
|
if (process.contextIsolated) { |
||||
|
try { |
||||
|
contextBridge.exposeInMainWorld('electron', electronAPI) |
||||
|
contextBridge.exposeInMainWorld('api', api) |
||||
|
contextBridge.exposeInMainWorld('elecClipboard', clipboard) |
||||
|
} catch (error) { |
||||
|
console.error(error) |
||||
|
} |
||||
|
} else { |
||||
|
window.electron = electronAPI |
||||
|
window.api = api |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="UTF-8" /> |
||||
|
<title>产品处理</title> |
||||
|
<!-- <link rel="icon" href="/icon/icon.jpg" /> --> |
||||
|
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --> |
||||
|
<meta |
||||
|
http-equiv="Content-Security-Policy" |
||||
|
content="default-src 'self'; script-src 'self';img-src 'self' data:; style-src 'self' 'unsafe-inline'" |
||||
|
/> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<div id="app"></div> |
||||
|
<script type="module" src="/src/main.js"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,84 @@ |
|||||
|
<template> |
||||
|
<div class="appClass" v-if="isVip"> |
||||
|
<el-tabs tab-position="left" class="appClass" @tab-change="tabChange" v-model="tabName"> |
||||
|
<el-tab-pane label="客户信息" name="user"> |
||||
|
<!-- todo --> |
||||
|
<user ref="user"></user> |
||||
|
</el-tab-pane> |
||||
|
<el-tab-pane label="产品信息" name="chanpin"> |
||||
|
<chanpin ref="chanpin"> |
||||
|
</chanpin> |
||||
|
</el-tab-pane> |
||||
|
<el-tab-pane label="订单信息" name="dingdan"> |
||||
|
<dingdan ref="dingdan"></dingdan> |
||||
|
</el-tab-pane> |
||||
|
</el-tabs> |
||||
|
</div> |
||||
|
<div v-else class="noVip"> |
||||
|
<h3> |
||||
|
<el-tag type="danger" class="noVipTag">体验已过期,请联系管理员。</el-tag> |
||||
|
</h3> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import dayjs from 'dayjs' |
||||
|
import user from "./views/user.vue" |
||||
|
import chanpin from "./views/chanpin.vue" |
||||
|
import dingdan from "./views/dingdan.vue" |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'app', |
||||
|
components: { user, chanpin, dingdan }, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
isVip: false, |
||||
|
tabName: "user", |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
tabChange(name) { |
||||
|
this.$refs[name].searchData() |
||||
|
}, |
||||
|
}, |
||||
|
async mounted() { |
||||
|
let fiveDay = dayjs('2024-06-29T00:00:00').valueOf() |
||||
|
if (!this.isVip) { |
||||
|
if (dayjs().valueOf() > fiveDay) { |
||||
|
this.isVip = false |
||||
|
return |
||||
|
} else { |
||||
|
this.isVip = true |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.appClass { |
||||
|
width: 100vw; |
||||
|
height: 100vh; |
||||
|
position: relative; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.menuClass { |
||||
|
border-right: 0; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.noVip { |
||||
|
text-align: center; |
||||
|
margin-top: calc(50vh - 48px); |
||||
|
} |
||||
|
|
||||
|
.noVipTag { |
||||
|
font-size: 48px; |
||||
|
line-height: 48px; |
||||
|
padding: 36px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,20 @@ |
|||||
|
html, |
||||
|
body { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
} |
||||
|
|
||||
|
.el-table .cell { |
||||
|
padding: 0 !important; |
||||
|
} |
||||
|
|
||||
|
.el-table .isNotSale { |
||||
|
background-color: #a0cfff; |
||||
|
} |
||||
|
|
||||
|
.el-table .redRow { |
||||
|
background-color: #fab6b6; |
||||
|
} |
||||
|
.el-table .yellowRow { |
||||
|
background-color: #f3d19e; |
||||
|
} |
@ -0,0 +1,810 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "代码", |
||||
|
"prop": "daima", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名", |
||||
|
"prop": "pinming", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格型号", |
||||
|
"prop": "guigexinghao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "助记符", |
||||
|
"prop": "zhujifu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "计量单位", |
||||
|
"prop": "jiliangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条形码", |
||||
|
"prop": "tiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装量", |
||||
|
"prop": "xiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装单位", |
||||
|
"prop": "xiangzhuangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装量", |
||||
|
"prop": "zuidadanweixiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装单位", |
||||
|
"prop": "zuidaxiangzhuangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产地", |
||||
|
"prop": "chandi", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "主供应商", |
||||
|
"prop": "zhugongyingshang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "经销商", |
||||
|
"prop": "jingxiaoshang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "所属类别", |
||||
|
"prop": "suoshuleibie", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最高采购价", |
||||
|
"prop": "zuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超价1", |
||||
|
"prop": "shangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "现金价", |
||||
|
"prop": "xianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "二批流通价", |
||||
|
"prop": "erpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超价", |
||||
|
"prop": "shangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "现金零售价", |
||||
|
"prop": "xianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商超零售价", |
||||
|
"prop": "shangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "特通价", |
||||
|
"prop": "tetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "分公司价", |
||||
|
"prop": "fengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "零食店价", |
||||
|
"prop": "shangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "初中高中价", |
||||
|
"prop": "chuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "车销价", |
||||
|
"prop": "chexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货价11", |
||||
|
"prop": "fahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货价12", |
||||
|
"prop": "fahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "进销税税率%", |
||||
|
"prop": "jinxiaoshuilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货税税率%", |
||||
|
"prop": "fahuoshuilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "包装", |
||||
|
"prop": "baozhuang", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "毛利率", |
||||
|
"prop": "maolilv", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "主存放仓库", |
||||
|
"prop": "zhucunfangcangku", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "有保质期", |
||||
|
"prop": "youbaozhiqi", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "保质期(天)", |
||||
|
"prop": "baozhiqi", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "有效", |
||||
|
"prop": "youxiao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采销类型", |
||||
|
"prop": "caixiaoleixing", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "商品类型", |
||||
|
"prop": "shangpinleixing", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "备注", |
||||
|
"prop": "beizhu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位重量", |
||||
|
"prop": "danweizhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品牌", |
||||
|
"prop": "pinpai", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位体积(立方米)", |
||||
|
"prop": "danweitiji", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱重量(kg)", |
||||
|
"prop": "xiangzhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位重量(kg)", |
||||
|
"prop": "zuidadanweizhongliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱体积(立方米)", |
||||
|
"prop": "xiangtiji", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "描述", |
||||
|
"prop": "miaoshu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "仓库出入库时,以‘箱装单位’为依准", |
||||
|
"prop": "yixiangzhuangdanweiweiyizhun", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "打印‘流通随行单’", |
||||
|
"prop": "liutongsuixingdan", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货产品", |
||||
|
"prop": "fahuochanpin", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "标准核算价", |
||||
|
"prop": "biaozhunhesuanjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "建议零售价", |
||||
|
"prop": "jianyilingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最近一次采购价", |
||||
|
"prop": "zuijinyicicaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最近一次销售价", |
||||
|
"prop": "zuijinyicixiaoshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱条形码", |
||||
|
"prop": "xiangtiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装条码", |
||||
|
"prop": "zuidaxiangzhuangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码1", |
||||
|
"prop": "jiekoubianma1", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码2", |
||||
|
"prop": "jiekoubianma2", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "接口编码3", |
||||
|
"prop": "jiekoubianma3", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "发货产品基数", |
||||
|
"prop": "fahuochanpinjishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购最少数量", |
||||
|
"prop": "caigouzuishaoshuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购倍数", |
||||
|
"prop": "caigoubeishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "采购滚动基数", |
||||
|
"prop": "caigougundongjishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位产品", |
||||
|
"prop": "zuixiaodanweichanpin", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位倍数", |
||||
|
"prop": "zuixiaodanweibeishu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品归类", |
||||
|
"prop": "chanpinguilei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品归类II", |
||||
|
"prop": "chanpinguilei2", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位最高采购价", |
||||
|
"prop": "xiangdanweizuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超价1", |
||||
|
"prop": "xiangdanweishangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位现金价", |
||||
|
"prop": "xiangdanweixianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位二批流通价", |
||||
|
"prop": "xiangdanweierpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超价", |
||||
|
"prop": "xiangdanweishangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位现金零售价", |
||||
|
"prop": "xiangdanweixianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位商超零售价", |
||||
|
"prop": "xiangdanweishangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位特通价", |
||||
|
"prop": "xiangdanweitetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位分公司价", |
||||
|
"prop": "xiangdanweifengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位零食店价", |
||||
|
"prop": "xiangdanweilingshidianjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位初中高中价", |
||||
|
"prop": "xiangdanweichuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位车销价", |
||||
|
"prop": "xiangdanweichexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位发货价11", |
||||
|
"prop": "xiangdanweifahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱单位发货价12", |
||||
|
"prop": "xiangdanweifahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位最高采购价", |
||||
|
"prop": "zuidadanweizuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超价1", |
||||
|
"prop": "zuidadanweishangchaojia1", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位现金价", |
||||
|
"prop": "zuidadanweixianjinjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位二批流通价", |
||||
|
"prop": "zuidadanweierpiliutongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超价", |
||||
|
"prop": "zuidadanweishangchaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位现金零售价", |
||||
|
"prop": "zuidadanweixianjinlingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位商超零售价", |
||||
|
"prop": "zuidadanweishangchaolingshoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位特通价", |
||||
|
"prop": "zuidadanweitetongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位分公司价", |
||||
|
"prop": "zuidadanweifengongsijia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位零食店价", |
||||
|
"prop": "zuidadanweilingshidianjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位初中高中价", |
||||
|
"prop": "zuidadanweichuzhonggaozhongjia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位车销价", |
||||
|
"prop": "zuidadanweichexiaojia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位发货价11", |
||||
|
"prop": "zuidadanweifahuojia11", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单位发货价12", |
||||
|
"prop": "zuidadanweifahuojia12", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "默认单据单位", |
||||
|
"prop": "morendanjudanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "不封箱单位", |
||||
|
"prop": "bufengxiangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "仓库提成类别", |
||||
|
"prop": "cangkutichengleibie", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "强制批次管理", |
||||
|
"prop": "qiangzhipiciguanli", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "立库存放区域", |
||||
|
"prop": "likucunfangquyu", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "建档日期", |
||||
|
"prop": "jiandangriqi", |
||||
|
"type": "date", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "出货是否加工", |
||||
|
"prop": "chuhuoshifujiagong", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "保质期天数需大于", |
||||
|
"prop": "baozhiqitianshuxudayu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单品重量误差", |
||||
|
"prop": "danpinzhongliangwucha", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大单品重量误差百分比%", |
||||
|
"prop": "zuidazhongliangwuchabaifenbi", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱重量误差", |
||||
|
"prop": "zuidaxiangzhongliangwucha", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "价格调整时间", |
||||
|
"prop": "jiagediaozhengshijian", |
||||
|
"type": "date", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "录入人", |
||||
|
"prop": "lururen", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "允收天数", |
||||
|
"prop": "yunshoutianshu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "强制序列号管理", |
||||
|
"prop": "qiangzhixuliehaoguanli", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "国标条形码", |
||||
|
"prop": "guobiaotiaoxingma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "长(cm)", |
||||
|
"prop": "chang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "宽(cm)", |
||||
|
"prop": "kuan", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "高(cm)", |
||||
|
"prop": "gao", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "每托盘件数", |
||||
|
"prop": "meituopanjianshu", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,206 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户编号", |
||||
|
"prop": "kehubianhao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "简称", |
||||
|
"prop": "username", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户名称", |
||||
|
"prop": "kehumingcheng", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "产品代码", |
||||
|
"prop": "chanpindaima", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "厂编", |
||||
|
"prop": "changbian", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportS6": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "货号", |
||||
|
"prop": "huohao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportS6": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单据单位数量", |
||||
|
"prop": "danjudanweishuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportS6": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条码", |
||||
|
"prop": "tiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最小单位条码", |
||||
|
"prop": "zuixiaodanweitiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "修改后销售数量", |
||||
|
"prop": "xiugaihouxiaoshoushuliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最高采购价", |
||||
|
"prop": "zuigaocaigoujia", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱装量", |
||||
|
"prop": "xiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱装量", |
||||
|
"prop": "zuidaxiangzhuangliang", |
||||
|
"type": "number", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格型号", |
||||
|
"prop": "guigexinghao", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "计量单位", |
||||
|
"prop": "jiliangdanwei", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "箱条码", |
||||
|
"prop": "xiangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "最大箱条码", |
||||
|
"prop": "zuidaxiangtiaoma", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "条码", |
||||
|
"prop": "tiaoma", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名", |
||||
|
"prop": "pinming", |
||||
|
"type": "select", |
||||
|
"formShow": true, |
||||
|
"tableShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "品名选项", |
||||
|
"prop": "pinmingxuanxiang", |
||||
|
"type": "textoption", |
||||
|
"formShow": false, |
||||
|
"tableShow": false |
||||
|
}, |
||||
|
{ |
||||
|
"label": "单位", |
||||
|
"prop": "danwei", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "规格", |
||||
|
"prop": "guige", |
||||
|
"type": "text", |
||||
|
"formShow": true, |
||||
|
"tableShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "销售数量", |
||||
|
"prop": "xiaoshoushuliang", |
||||
|
"type": "number", |
||||
|
"formShow": true, |
||||
|
"tableShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "销售金额", |
||||
|
"prop": "xiaoshoujine", |
||||
|
"type": "number", |
||||
|
"formShow": true, |
||||
|
"tableShow": true, |
||||
|
"exportxiaoshou": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "是否有售卖", |
||||
|
"prop": "isNotSale", |
||||
|
"type": "number", |
||||
|
"formShow": false, |
||||
|
"tableShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,40 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"label": "创建时间", |
||||
|
"prop": "create_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "更新时间", |
||||
|
"prop": "update_at", |
||||
|
"type": "date" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "客户编号", |
||||
|
"prop": "usercode", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "简称", |
||||
|
"prop": "username", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "业务员", |
||||
|
"prop": "salesman", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
}, |
||||
|
{ |
||||
|
"label": "地址", |
||||
|
"prop": "address", |
||||
|
"type": "text", |
||||
|
"tableShow": true, |
||||
|
"formShow": true |
||||
|
} |
||||
|
] |
@ -0,0 +1,83 @@ |
|||||
|
<template> |
||||
|
<div class="tableClass"> |
||||
|
<el-form :model="formData" label-suffix=":" inline :disabled="disabled"> |
||||
|
<el-form-item :label="formItem.label" :key="formIndex" v-for="(formItem, formIndex) in formHeader"> |
||||
|
<template v-if="formItem.type === 'text'"> |
||||
|
<el-input v-model="formData[formItem.prop]" /> |
||||
|
</template> |
||||
|
<template v-else-if="formItem.type === 'select'"> |
||||
|
<el-select v-model="formData[formItem.prop]" :placeholder="`请选择${formItem.label}`" style="width: 240px" > |
||||
|
<el-option v-for="item in formData[formItem.prop + 'xuanxiang']" :key="item.value" :label="item.label" |
||||
|
:value="item.value" /> |
||||
|
</el-select> |
||||
|
</template> |
||||
|
<template v-else-if="formItem.type === 'number'"> |
||||
|
<el-input-number v-model="formData[formItem.prop]"> |
||||
|
<template #decrease-icon> |
||||
|
<el-icon> |
||||
|
<ArrowDown /> |
||||
|
</el-icon> |
||||
|
</template> |
||||
|
<template #increase-icon> |
||||
|
<el-icon> |
||||
|
<ArrowUp /> |
||||
|
</el-icon> |
||||
|
</template> |
||||
|
</el-input-number> |
||||
|
</template> |
||||
|
<template v-else-if="formItem.type === 'date'"> |
||||
|
<el-date-picker v-model="formData[formItem.prop]" type="date" :placeholder="`请选择${formItem.label}`" /> |
||||
|
<el-input /> |
||||
|
</template> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import dayjs from 'dayjs' |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'dingdanformcomponent', |
||||
|
components: {}, |
||||
|
props: { |
||||
|
formHeader: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
formData: { |
||||
|
type: Object, |
||||
|
default: () => { |
||||
|
return {} |
||||
|
} |
||||
|
}, |
||||
|
disabled: { |
||||
|
type: Boolean, |
||||
|
default: () => { |
||||
|
return false |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
methods: {}, |
||||
|
async mounted() { }, |
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.tableClass { |
||||
|
text-align: left; |
||||
|
text-align-last: left; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,136 @@ |
|||||
|
<template> |
||||
|
<div class="tableClass"> |
||||
|
<el-table :data="tableData" height="calc(100vh - 84px)" border @select="selectChange" @select-all="selectChange" fit |
||||
|
:row-key="getRowKeys" :row-class-name="getRowClassName"> |
||||
|
<el-table-column type="selection" width="38" :reserve-selection="true" fixed="left"> |
||||
|
</el-table-column> |
||||
|
<el-table-column type="index" width="38" :reserve-selection="true" fixed="left" label="序号"> |
||||
|
</el-table-column> |
||||
|
<el-table-column v-for="(headerItem, headerIndex) in tableHeader" :label="headerItem.label" show-overflow-tooltip |
||||
|
:key="headerIndex" :min-width="`${headerItem.label.length * 15 + 8}px`"> |
||||
|
<template #default="scope"> |
||||
|
<template v-if="headerItem.type === 'text'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else-if="headerItem.type === 'date'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else-if="headerItem.type === 'number'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else>{{ scope.row[headerItem.prop] }}</template> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column fixed="right" label="操作" width="145"> |
||||
|
<template #default="scope"> |
||||
|
<el-button type="primary" circle @click="optClick(scope.row, 'edit')"> |
||||
|
<el-icon> |
||||
|
<Edit /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
<el-button type="info" circle @click="optClick(scope.row, 'info')"> |
||||
|
<el-icon> |
||||
|
<InfoFilled /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
<el-button type="danger" circle @click="optClick(scope.row, 'del')"> |
||||
|
<el-icon> |
||||
|
<Delete /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<el-pagination style="margin:8px 0 0 0" v-model:current-page="currentPage" v-model:page-size="pageSize" |
||||
|
:total="total" @size-change="handleSizeChange" layout="total, sizes, prev, pager, next, jumper" |
||||
|
:page-sizes="pageSizes" @current-change="handleCurrentChange" @prev-click="handleCurrentChange" |
||||
|
@next-click="handleCurrentChange"></el-pagination> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import dayjs from 'dayjs' |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'dingdantablecomponent', |
||||
|
components: {}, |
||||
|
props: { |
||||
|
tableHeader: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
tableData: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
pageSizes: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [16, 50, 100, 200] |
||||
|
} |
||||
|
}, |
||||
|
total: { |
||||
|
type: Number, |
||||
|
default: () => { |
||||
|
return 0 |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
currentPage: 1, |
||||
|
pageSize: 16, |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
selectChange(selection) { |
||||
|
this.$emit("selectChange", selection) |
||||
|
}, |
||||
|
handleSizeChange(pageSize) { |
||||
|
this.$emit("handleSizeChange", pageSize) |
||||
|
}, |
||||
|
handleCurrentChange(currentPage) { |
||||
|
this.$emit("handleCurrentChange", currentPage) |
||||
|
}, |
||||
|
optClick(row, type) { |
||||
|
this.$emit(type, row) |
||||
|
}, |
||||
|
// 确定唯一的key值 |
||||
|
getRowKeys(row) { |
||||
|
return row._id; // 每条数据的唯一识别值 |
||||
|
}, |
||||
|
// 设置行属性 |
||||
|
getRowClassName({ row }) { |
||||
|
if (row.isNotSale) { |
||||
|
return 'isNotSale' |
||||
|
} |
||||
|
if (row.xiaoshoujine < row.zuigaocaigoujia) { |
||||
|
return 'redRow' |
||||
|
} |
||||
|
if ((row.pinmingxuanxiang || []).length > 1) { |
||||
|
return 'yellowRow' |
||||
|
} |
||||
|
return '' |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
}, |
||||
|
async mounted() { }, |
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.tableClass { |
||||
|
text-align: center; |
||||
|
text-align-last: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,77 @@ |
|||||
|
<template> |
||||
|
<div class="tableClass"> |
||||
|
<el-form :model="formData" label-suffix=":" inline :disabled="disabled"> |
||||
|
<el-form-item :label="formItem.label" :key="formIndex" v-for="(formItem, formIndex) in formHeader"> |
||||
|
<template v-if="formItem.type === 'text'"> |
||||
|
<el-input v-model="formData[formItem.prop]" /> |
||||
|
</template> |
||||
|
<template v-else-if="formItem.type === 'number'"> |
||||
|
<el-input-number v-model="formData[formItem.prop]"> |
||||
|
<template #decrease-icon> |
||||
|
<el-icon> |
||||
|
<ArrowDown /> |
||||
|
</el-icon> |
||||
|
</template> |
||||
|
<template #increase-icon> |
||||
|
<el-icon> |
||||
|
<ArrowUp /> |
||||
|
</el-icon> |
||||
|
</template> |
||||
|
</el-input-number> |
||||
|
</template> |
||||
|
<template v-else-if="formItem.type === 'date'"> |
||||
|
<el-date-picker v-model="formData[formItem.prop]" type="date" :placeholder="`请选择${formItem.label}`" /> |
||||
|
<el-input /> |
||||
|
</template> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import dayjs from 'dayjs' |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'formcomponent', |
||||
|
components: {}, |
||||
|
props: { |
||||
|
formHeader: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
formData: { |
||||
|
type: Object, |
||||
|
default: () => { |
||||
|
return {} |
||||
|
} |
||||
|
}, |
||||
|
disabled: { |
||||
|
type: Boolean, |
||||
|
default: () => { |
||||
|
return false |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
methods: {}, |
||||
|
async mounted() { }, |
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.tableClass { |
||||
|
text-align: left; |
||||
|
text-align-last: left; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,120 @@ |
|||||
|
<template> |
||||
|
<div class="tableClass"> |
||||
|
<el-table :data="tableData" height="calc(100vh - 84px)" border @select="selectChange" @select-all="selectChange" fit :row-key="getRowKeys"> |
||||
|
<el-table-column type="selection" width="38" :reserve-selection="true" fixed="left"> |
||||
|
</el-table-column> |
||||
|
<el-table-column type="index" width="38" :reserve-selection="true" fixed="left" label="序号"> |
||||
|
</el-table-column> |
||||
|
<el-table-column v-for="(headerItem, headerIndex) in tableHeader" :label="headerItem.label" show-overflow-tooltip |
||||
|
:key="headerIndex" :min-width="`${headerItem.label.length*15+8}px`"> |
||||
|
<template #default="scope"> |
||||
|
<template v-if="headerItem.type === 'text'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else-if="headerItem.type === 'date'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else-if="headerItem.type === 'number'"> |
||||
|
<span>{{ scope.row[headerItem.prop] }}</span> |
||||
|
</template> |
||||
|
<template v-else>{{ scope.row[headerItem.prop] }}</template> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column fixed="right" label="操作" width="145"> |
||||
|
<template #default="scope"> |
||||
|
<el-button type="primary" circle @click="optClick(scope.row, 'edit')"> |
||||
|
<el-icon> |
||||
|
<Edit /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
<el-button type="info" circle @click="optClick(scope.row, 'info')"> |
||||
|
<el-icon> |
||||
|
<InfoFilled /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
<el-button type="danger" circle @click="optClick(scope.row, 'del')"> |
||||
|
<el-icon> |
||||
|
<Delete /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<el-pagination style="margin:8px 0 0 0" v-model:current-page="currentPage" v-model:page-size="pageSize" |
||||
|
:total="total" @size-change="handleSizeChange" layout="total, sizes, prev, pager, next, jumper" |
||||
|
:page-sizes="pageSizes" @current-change="handleCurrentChange" @prev-click="handleCurrentChange" |
||||
|
@next-click="handleCurrentChange"></el-pagination> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import dayjs from 'dayjs' |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'tablecomponent', |
||||
|
components: {}, |
||||
|
props: { |
||||
|
tableHeader: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
tableData: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
pageSizes: { |
||||
|
type: Array, |
||||
|
default: () => { |
||||
|
return [16, 50, 100, 200] |
||||
|
} |
||||
|
}, |
||||
|
total: { |
||||
|
type: Number, |
||||
|
default: () => { |
||||
|
return 0 |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
currentPage: 1, |
||||
|
pageSize: 16, |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
selectChange(selection) { |
||||
|
this.$emit("selectChange", selection) |
||||
|
}, |
||||
|
handleSizeChange(pageSize) { |
||||
|
this.$emit("handleSizeChange", pageSize) |
||||
|
}, |
||||
|
handleCurrentChange(currentPage) { |
||||
|
this.$emit("handleCurrentChange", currentPage) |
||||
|
}, |
||||
|
optClick(row, type) { |
||||
|
this.$emit(type, row) |
||||
|
}, |
||||
|
// 确定唯一的key值 |
||||
|
getRowKeys(row) { |
||||
|
return row._id; // 每条数据的唯一识别值 |
||||
|
}, |
||||
|
}, |
||||
|
async mounted() { }, |
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.tableClass { |
||||
|
text-align: center; |
||||
|
text-align-last: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,28 @@ |
|||||
|
// main.ts
|
||||
|
import { createApp } from 'vue' |
||||
|
import ElementPlus from 'element-plus' |
||||
|
import zhCn from 'element-plus/es/locale/lang/zh-cn' |
||||
|
import 'element-plus/dist/index.css' |
||||
|
import App from './App.vue' |
||||
|
import './assets/css/base.css' |
||||
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue' |
||||
|
import axios from 'axios' |
||||
|
import * as XLSX from 'xlsx'; |
||||
|
const app = createApp(App) |
||||
|
app.config.globalProperties.$axios = axios |
||||
|
app.config.globalProperties.$XLSX = XLSX |
||||
|
// window.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = true
|
||||
|
for (const [key, component] of Object.entries(ElementPlusIconsVue)) { |
||||
|
app.component(key, component) |
||||
|
} |
||||
|
app.use(ElementPlus, { |
||||
|
locale: zhCn, |
||||
|
}) |
||||
|
app.mount('#app') |
||||
|
|
||||
|
document.addEventListener('keydown', (event) => { |
||||
|
const { ctrlKey, shiftKey, key } = event |
||||
|
if ((ctrlKey && shiftKey && key === 'I') || key === 'F12') { |
||||
|
return event.preventDefault() |
||||
|
} |
||||
|
}) |
@ -0,0 +1,358 @@ |
|||||
|
<template> |
||||
|
<div class="rightClass"> |
||||
|
<div style="margin:0 0 8px 0"> |
||||
|
<el-button type="primary" @click="addData"> |
||||
|
<el-icon> |
||||
|
<Plus /> |
||||
|
</el-icon> |
||||
|
<span>新增</span> |
||||
|
</el-button> |
||||
|
<el-button type="danger" @click="deleteData(selectionData)" :disabled="selectionData.length == 0"> |
||||
|
<el-icon> |
||||
|
<Delete /> |
||||
|
</el-icon> |
||||
|
<span>删除</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass uploadClass"> |
||||
|
<el-upload :show-file-list="false" v-model="fileOriData" :before-upload="beforeAvatarUpload" |
||||
|
:http-request="successSubmit" accept=".xls,.xlsx,.csv"> |
||||
|
<el-button type="success"> |
||||
|
<el-icon> |
||||
|
<Upload /> |
||||
|
</el-icon> |
||||
|
<span>上传</span> |
||||
|
</el-button> |
||||
|
</el-upload> |
||||
|
</div> |
||||
|
<el-button type="primary" @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Refresh /> |
||||
|
</el-icon> |
||||
|
<span>刷新</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass"> |
||||
|
<el-input v-model="searchParams.daima" style="max-width: 600px" placeholder="请输入代码" clearable |
||||
|
@clear="searchData" @keyup.enter="searchData"> |
||||
|
<template #append> |
||||
|
<el-button @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Search /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-input> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :pageSizes="pageSizes" :total="total" |
||||
|
@selectChange="selectChange" @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange" |
||||
|
@edit="edit" @info="info" @del="del"> |
||||
|
</tablecomponent> |
||||
|
</div> |
||||
|
<el-dialog v-model="dialogFrom.visible" :title="dialogFrom.title" width="80%"> |
||||
|
<formcomponent :formHeader="dialogFrom.formHeader" :formData="dialogFrom.formData" |
||||
|
:disabled="dialogFrom.disabled"> |
||||
|
</formcomponent> |
||||
|
<template #footer> |
||||
|
<div> |
||||
|
<el-button @click="cancelDialog">取消</el-button> |
||||
|
<el-button type="primary" @click="submitDialog"> 确认 </el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import tableHeaderLocal from '../assets/json/chanpin.json' |
||||
|
import dayjs from 'dayjs' |
||||
|
import tablecomponent from "../components/tablecomponent.vue" |
||||
|
import formcomponent from "../components/formcomponent.vue" |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'chanpin', |
||||
|
components: { tablecomponent, formcomponent }, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
tableHeader: [], |
||||
|
formHeader: [], |
||||
|
tableData: [], |
||||
|
currentPage: 1, |
||||
|
pageSize: 16, |
||||
|
pageSizes: [16, 50, 100, 200], |
||||
|
total: 0, |
||||
|
searchParams: { |
||||
|
daima: "" |
||||
|
}, |
||||
|
selectionData: [], |
||||
|
dialogFrom: { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
}, |
||||
|
fileOriData: [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
/** |
||||
|
* 上传表格检查 |
||||
|
*/ |
||||
|
beforeAvatarUpload(rawFile) { |
||||
|
let imgList = ['text/csv', 'application/vnd.ms-excel', "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] |
||||
|
if (imgList.indexOf(rawFile.type) === -1) { |
||||
|
this.$msgbox.alert('请上传excel,csv格式的表格文件!') |
||||
|
return false |
||||
|
} else if (rawFile.size / 1024 / 1024 > 50) { |
||||
|
this.$msgbox.alert('表格文件的大小为小于50MB,数据过多时会处理过慢') |
||||
|
return true |
||||
|
} |
||||
|
return true |
||||
|
}, |
||||
|
//表格增加数据 |
||||
|
async successSubmit(opts) { |
||||
|
let that = this |
||||
|
let file = opts.file |
||||
|
this.fileDealData = [] |
||||
|
let fileReader = new FileReader() |
||||
|
fileReader.onload = async function () { |
||||
|
let data = this.result |
||||
|
let workbook = that.$XLSX.read(data, { type: 'binary' }) |
||||
|
let sheetName = workbook.SheetNames[0] |
||||
|
let sheetData = that.$XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]) |
||||
|
let list = [] |
||||
|
for (let i = 0; i < sheetData.length; i++) { |
||||
|
let element = sheetData[i]; |
||||
|
let item = {} |
||||
|
for (let j = 0; j < that.tableHeader.length; j++) { |
||||
|
let headerItem = that.tableHeader[j]; |
||||
|
if (element[headerItem.label]) { |
||||
|
if (headerItem.type === "text") { |
||||
|
item[headerItem.prop] = element[headerItem.label] |
||||
|
} else if (headerItem.type === "number") { |
||||
|
item[headerItem.prop] = Number(element[headerItem.label]) |
||||
|
} else if (headerItem.type === "date") { |
||||
|
item[headerItem.prop] = dayjs(element[headerItem.label]).format("YYYY-MM-DD HH:mm:ss") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
list.push(item) |
||||
|
} |
||||
|
let params = { |
||||
|
subType: "multi", |
||||
|
url: "/api/chanpinInfo", |
||||
|
list |
||||
|
} |
||||
|
ElMessage({ |
||||
|
message: "数据处理中", |
||||
|
type: 'success' |
||||
|
}) |
||||
|
await that.updateSeach(params) |
||||
|
setTimeout(() => { |
||||
|
that.updateSeach({ subType: "get" }) |
||||
|
}, 3000); |
||||
|
} |
||||
|
fileReader.onerror = function (error) { |
||||
|
console.error('Error reading file:', error) |
||||
|
} |
||||
|
fileReader.readAsArrayBuffer(file) |
||||
|
}, |
||||
|
//初始化数据 |
||||
|
initInfo() { |
||||
|
let that = this |
||||
|
window.electron.ipcRenderer.on('chanpinInfo', (eve, str) => { |
||||
|
that.tableData = [] |
||||
|
if (str.hasError) { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'error' |
||||
|
}) |
||||
|
} else { |
||||
|
if (str.msg !== "查询成功") { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'success' |
||||
|
}) |
||||
|
} |
||||
|
if (_.isArray(str.list)) { |
||||
|
that.tableData = str.list |
||||
|
} else if (_.isObject(str.list)) { |
||||
|
that.tableData = [str.list] |
||||
|
} |
||||
|
that.total = str.count |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
//更新数据 |
||||
|
async updateSeach(params = {}) { |
||||
|
let localParams = { |
||||
|
subType: "get", |
||||
|
url: "/api/chanpinInfo", |
||||
|
pageSize: this.pageSize, |
||||
|
currentPage: this.currentPage, |
||||
|
...params, |
||||
|
} |
||||
|
window.electron.ipcRenderer.send('sendMessage', localParams) |
||||
|
}, |
||||
|
//搜索数据 |
||||
|
async searchData() { |
||||
|
let params = {} |
||||
|
if (this.searchParams.daima) { |
||||
|
params["daima"] = this.searchParams.daima |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
}, |
||||
|
//选中数据 |
||||
|
selectChange(selection) { |
||||
|
this.selectionData = _.cloneDeep(selection) |
||||
|
}, |
||||
|
//当前页 |
||||
|
async handleCurrentChange(currentPage) { |
||||
|
this.currentPage = currentPage |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//分页 |
||||
|
async handleSizeChange(pageSize) { |
||||
|
this.pageSize = pageSize |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//关闭模态框 |
||||
|
cancelDialog() { |
||||
|
this.dialogFrom = { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
} |
||||
|
}, |
||||
|
//确认模态框 |
||||
|
async submitDialog() { |
||||
|
let postMethod = ["add", "multi", "edit", "get", "del"] |
||||
|
if (postMethod.indexOf(this.dialogFrom.type) !== -1) { |
||||
|
let params = { |
||||
|
subType: this.dialogFrom.type, |
||||
|
url: "/api/chanpinInfo", |
||||
|
list: [{ ...this.dialogFrom.formData }] |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await setTimeout(async () => { |
||||
|
await this.searchData() |
||||
|
}, 500); |
||||
|
} |
||||
|
this.cancelDialog() |
||||
|
}, |
||||
|
//打开新增模态框 |
||||
|
addData() { |
||||
|
let formData = {} |
||||
|
for (let i = 0; i < this.formHeader.length; i++) { |
||||
|
let element = this.formHeader[i]; |
||||
|
if (element.type === "text") { |
||||
|
formData[element.prop] = "" |
||||
|
} else if (element.type === "date") { |
||||
|
formData[element.prop] = dayjs().format("YYYY-MM-DD") |
||||
|
} else if (element.type === "number") { |
||||
|
formData[element.prop] = 0 |
||||
|
} |
||||
|
} |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData |
||||
|
} |
||||
|
}, |
||||
|
//打开编辑数据模态框 |
||||
|
edit(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "编辑用户", |
||||
|
type: "edit", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//打开查看数据模态框 |
||||
|
info(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "查看用户", |
||||
|
type: "info", |
||||
|
disabled: true, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//删除数据 |
||||
|
del(row) { |
||||
|
this.deleteData([row]) |
||||
|
}, |
||||
|
//批量删除数据 |
||||
|
deleteData(delList) { |
||||
|
let tooltipList = [] |
||||
|
let idList = [] |
||||
|
for (let i = 0; i < delList.length; i++) { |
||||
|
let element = delList[i]; |
||||
|
tooltipList.push(element.username) |
||||
|
idList.push(element._id) |
||||
|
} |
||||
|
ElMessageBox.confirm( |
||||
|
`是否删除(${_.join(tooltipList, ",")})?`, |
||||
|
'danger', |
||||
|
{ |
||||
|
confirmButtonText: '确认', |
||||
|
cancelButtonText: '取消', |
||||
|
type: 'danger', |
||||
|
} |
||||
|
) |
||||
|
.then(async () => { |
||||
|
let params = { |
||||
|
subType: "del", |
||||
|
url: "/api/chanpinInfo", |
||||
|
ids: idList, |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await this.searchData() |
||||
|
}) |
||||
|
.catch(() => { |
||||
|
ElMessage({ |
||||
|
type: 'info', |
||||
|
message: '取消删除', |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
async mounted() { |
||||
|
this.tableHeader = _.filter(tableHeaderLocal, o => o.tableShow) |
||||
|
this.formHeader = _.filter(tableHeaderLocal, o => o.formShow) |
||||
|
this.initInfo() |
||||
|
await this.updateSeach() |
||||
|
}, |
||||
|
|
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.rightClass { |
||||
|
padding: 0 8px 0 0; |
||||
|
} |
||||
|
|
||||
|
.uploadClass { |
||||
|
top: 3px; |
||||
|
} |
||||
|
|
||||
|
.inputClass { |
||||
|
display: inline-block; |
||||
|
margin: 0 8px; |
||||
|
position: relative; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,492 @@ |
|||||
|
<template> |
||||
|
<div class="rightClass"> |
||||
|
<div style="margin:0 0 8px 0"> |
||||
|
<!-- <el-button type="primary" @click="addData"> |
||||
|
<el-icon> |
||||
|
<Plus /> |
||||
|
</el-icon> |
||||
|
<span>新增</span> |
||||
|
</el-button> --> |
||||
|
<el-button type="danger" @click="deleteData(selectionData)" :disabled="selectionData.length == 0"> |
||||
|
<el-icon> |
||||
|
<Delete /> |
||||
|
</el-icon> |
||||
|
<span>删除</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass uploadClass"> |
||||
|
<el-upload :show-file-list="false" v-model="fileOriData" :before-upload="beforeAvatarUpload" |
||||
|
:http-request="successSubmit" accept=".xls,.xlsx,.csv"> |
||||
|
<el-button type="success"> |
||||
|
<el-icon> |
||||
|
<Upload /> |
||||
|
</el-icon> |
||||
|
<span>上传</span> |
||||
|
</el-button> |
||||
|
</el-upload> |
||||
|
</div> |
||||
|
<el-button type="primary" @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Refresh /> |
||||
|
</el-icon> |
||||
|
<span>刷新</span> |
||||
|
</el-button> |
||||
|
<el-button type="primary" @click="exportxiaoshoudata"> |
||||
|
<el-icon> |
||||
|
<Download /> |
||||
|
</el-icon> |
||||
|
<span>导出销售订单</span> |
||||
|
</el-button> |
||||
|
<el-button type="primary" @click="exportS6data"> |
||||
|
<el-icon> |
||||
|
<Download /> |
||||
|
</el-icon> |
||||
|
<span>导出S6</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass"> |
||||
|
<el-input v-model="searchParams.kehubianhao" style="max-width: 400px" placeholder="请输入客户编号" clearable |
||||
|
@clear="searchData" @keyup.enter="searchData"> |
||||
|
<template #append> |
||||
|
<el-button @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Search /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-input> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<dingdantablecomponent :tableHeader="tableHeader" :tableData="tableData" :pageSizes="pageSizes" :total="total" |
||||
|
@selectChange="selectChange" @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange" |
||||
|
@edit="edit" @info="info" @del="del"> |
||||
|
</dingdantablecomponent> |
||||
|
</div> |
||||
|
<el-dialog v-model="dialogFrom.visible" :title="dialogFrom.title" width="80%"> |
||||
|
<dingdanformcomponent :formHeader="dialogFrom.formHeader" :formData="dialogFrom.formData" |
||||
|
:disabled="dialogFrom.disabled"> |
||||
|
</dingdanformcomponent> |
||||
|
<template #footer> |
||||
|
<div> |
||||
|
<el-button @click="cancelDialog">取消</el-button> |
||||
|
<el-button type="primary" @click="submitDialog"> 确认 </el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _, { range } from 'lodash' |
||||
|
import tableHeaderLocal from '../assets/json/dingdan.json' |
||||
|
import dayjs from 'dayjs' |
||||
|
import dingdantablecomponent from "../components/dingdantablecomponent.vue" |
||||
|
import dingdanformcomponent from "../components/dingdanformcomponent.vue" |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'dingdan', |
||||
|
components: { dingdantablecomponent, dingdanformcomponent }, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
tableHeader: [], |
||||
|
formHeader: [], |
||||
|
tableData: [], |
||||
|
currentPage: 1, |
||||
|
pageSize: 16, |
||||
|
pageSizes: [16, 50, 100, 200], |
||||
|
total: 0, |
||||
|
searchParams: { |
||||
|
kehubianhao: "" |
||||
|
}, |
||||
|
selectionData: [], |
||||
|
dialogFrom: { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
}, |
||||
|
fileOriData: [], |
||||
|
exportxiaoshou: [], |
||||
|
exportS6: [], |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
/** |
||||
|
* 上传表格检查 |
||||
|
*/ |
||||
|
beforeAvatarUpload(rawFile) { |
||||
|
let imgList = ['text/csv', 'application/vnd.ms-excel', "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] |
||||
|
if (imgList.indexOf(rawFile.type) === -1) { |
||||
|
this.$msgbox.alert('请上传excel,csv格式的表格文件!') |
||||
|
return false |
||||
|
} else if (rawFile.size / 1024 / 1024 > 50) { |
||||
|
this.$msgbox.alert('表格文件的大小为小于50MB,数据过多时会处理过慢') |
||||
|
return true |
||||
|
} |
||||
|
return true |
||||
|
}, |
||||
|
//表格增加数据 |
||||
|
async successSubmit(opts) { |
||||
|
let that = this |
||||
|
let file = opts.file |
||||
|
this.fileDealData = [] |
||||
|
let fileReader = new FileReader() |
||||
|
fileReader.onload = async function () { |
||||
|
let data = this.result |
||||
|
let workbook = that.$XLSX.read(data, { type: 'binary' }) |
||||
|
let sheetName = workbook.SheetNames[0] |
||||
|
let sheetData = that.$XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { range: 1 }) |
||||
|
let list = [] |
||||
|
for (let i = 0; i < sheetData.length; i++) { |
||||
|
let element = sheetData[i]; |
||||
|
let item = {} |
||||
|
for (let j = 0; j < that.tableHeader.length; j++) { |
||||
|
let headerItem = that.tableHeader[j]; |
||||
|
if (element[headerItem.label]) { |
||||
|
if (headerItem.type === "text") { |
||||
|
item[headerItem.prop] = element[headerItem.label] |
||||
|
} else if (headerItem.type === "number") { |
||||
|
item[headerItem.prop] = Number(element[headerItem.label]) |
||||
|
} else if (headerItem.type === "date") { |
||||
|
item[headerItem.prop] = dayjs(element[headerItem.label]).format("YYYY-MM-DD HH:mm:ss") |
||||
|
} else if (headerItem.type === "select") { |
||||
|
item[headerItem.prop] = element[headerItem.label] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
list.push(item) |
||||
|
} |
||||
|
ElMessageBox.prompt('请输入客户编码', '导入订单信息', { |
||||
|
confirmButtonText: '确认', |
||||
|
cancelButtonText: '取消', |
||||
|
}) |
||||
|
.then(async ({ value }) => { |
||||
|
let ele = _.find(list, o => o.kehumingcheng) |
||||
|
for (let i = 0; i < list.length; i++) { |
||||
|
let element = list[i]; |
||||
|
element['kehumingcheng'] = ele.kehumingcheng |
||||
|
element['kehubianhao'] = value |
||||
|
} |
||||
|
let params = { |
||||
|
subType: "multi", |
||||
|
url: "/api/dingdanInfo", |
||||
|
list |
||||
|
} |
||||
|
ElMessage({ |
||||
|
message: "数据处理中", |
||||
|
type: 'success' |
||||
|
}) |
||||
|
await that.updateSeach(params) |
||||
|
setTimeout(() => { |
||||
|
that.updateSeach({ subType: "get" }) |
||||
|
}, 1500); |
||||
|
}) |
||||
|
.catch(() => { |
||||
|
ElMessage({ |
||||
|
type: 'danger', |
||||
|
message: '导入失败', |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
} |
||||
|
fileReader.onerror = function (error) { |
||||
|
console.error('Error reading file:', error) |
||||
|
} |
||||
|
fileReader.readAsArrayBuffer(file) |
||||
|
}, |
||||
|
//监听数据变化实时显示 |
||||
|
initInfo() { |
||||
|
let that = this |
||||
|
window.electron.ipcRenderer.on('dingdanInfo', (eve, str) => { |
||||
|
that.tableData = [] |
||||
|
if (str.hasError) { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'error' |
||||
|
}) |
||||
|
} else { |
||||
|
if (str.msg !== "查询成功") { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'success' |
||||
|
}) |
||||
|
} |
||||
|
if (_.isArray(str.list)) { |
||||
|
that.tableData = str.list |
||||
|
} else if (_.isObject(str.list)) { |
||||
|
that.tableData = [str.list] |
||||
|
} |
||||
|
that.total = str.count |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
//监听导出数据变化 |
||||
|
exportData() { |
||||
|
let that = this |
||||
|
window.electron.ipcRenderer.on('Dingdan', (eve, str) => { |
||||
|
if (str.hasError) { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'error' |
||||
|
}) |
||||
|
} else { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'success' |
||||
|
}) |
||||
|
this[`deal${str.subType}`](str.list) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
//更新数据 |
||||
|
async updateSeach(params = {}) { |
||||
|
let localParams = { |
||||
|
subType: "get", |
||||
|
url: "/api/dingdanInfo", |
||||
|
// url:"/api/chanpinInfo", |
||||
|
pageSize: this.pageSize, |
||||
|
currentPage: this.currentPage, |
||||
|
...params, |
||||
|
} |
||||
|
window.electron.ipcRenderer.send('sendMessage', _.cloneDeep(localParams)) |
||||
|
}, |
||||
|
//搜索数据 |
||||
|
async searchData() { |
||||
|
let params = {} |
||||
|
if (this.searchParams.kehubianhao) { |
||||
|
params["kehubianhao"] = this.searchParams.kehubianhao |
||||
|
} |
||||
|
this.updateSeach(params) |
||||
|
}, |
||||
|
//选中数据 |
||||
|
selectChange(selection) { |
||||
|
this.selectionData = _.cloneDeep(selection) |
||||
|
}, |
||||
|
//当前页 |
||||
|
async handleCurrentChange(currentPage) { |
||||
|
this.currentPage = currentPage |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//分页 |
||||
|
async handleSizeChange(pageSize) { |
||||
|
this.pageSize = pageSize |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//关闭模态框 |
||||
|
cancelDialog() { |
||||
|
this.dialogFrom = { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
} |
||||
|
}, |
||||
|
//确认模态框 |
||||
|
async submitDialog() { |
||||
|
let postMethod = ["add", "multi", "edit", "get", "del"] |
||||
|
if (postMethod.indexOf(this.dialogFrom.type) !== -1) { |
||||
|
let params = { |
||||
|
subType: this.dialogFrom.type, |
||||
|
url: "/api/dingdanInfo", |
||||
|
list: [{ ...this.dialogFrom.formData }] |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await setTimeout(async () => { |
||||
|
await this.searchData() |
||||
|
}, 500); |
||||
|
} |
||||
|
this.cancelDialog() |
||||
|
}, |
||||
|
//打开新增模态框 |
||||
|
addData() { |
||||
|
let formData = {} |
||||
|
for (let i = 0; i < this.formHeader.length; i++) { |
||||
|
let element = this.formHeader[i]; |
||||
|
if (element.type === "text") { |
||||
|
formData[element.prop] = "" |
||||
|
} else if (element.type === "date") { |
||||
|
formData[element.prop] = dayjs().format("YYYY-MM-DD") |
||||
|
} else if (element.type === "number") { |
||||
|
formData[element.prop] = 0 |
||||
|
} |
||||
|
} |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData |
||||
|
} |
||||
|
}, |
||||
|
//打开编辑数据模态框 |
||||
|
edit(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "编辑用户", |
||||
|
type: "edit", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//打开查看数据模态框 |
||||
|
info(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "查看用户", |
||||
|
type: "info", |
||||
|
disabled: true, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//删除数据 |
||||
|
del(row) { |
||||
|
this.deleteData([row]) |
||||
|
}, |
||||
|
//批量删除数据 |
||||
|
deleteData(delList) { |
||||
|
let tooltipList = [] |
||||
|
let idList = [] |
||||
|
for (let i = 0; i < delList.length; i++) { |
||||
|
let element = delList[i]; |
||||
|
tooltipList.push(element.username) |
||||
|
idList.push(element._id) |
||||
|
} |
||||
|
ElMessageBox.confirm( |
||||
|
`是否删除(${_.join(tooltipList, ",")})?`, |
||||
|
'danger', |
||||
|
{ |
||||
|
confirmButtonText: '确认', |
||||
|
cancelButtonText: '取消', |
||||
|
type: 'danger', |
||||
|
} |
||||
|
) |
||||
|
.then(async () => { |
||||
|
let params = { |
||||
|
subType: "del", |
||||
|
url: "/api/dingdanInfo", |
||||
|
ids: idList, |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await this.searchData() |
||||
|
}) |
||||
|
.catch(() => { |
||||
|
ElMessage({ |
||||
|
type: 'info', |
||||
|
message: '取消删除', |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
}, |
||||
|
//导出销售订单 |
||||
|
exportxiaoshoudata() { |
||||
|
|
||||
|
let params = { |
||||
|
subType: "exportxiaoshou", |
||||
|
url: "/api/exportDingdanInfo", |
||||
|
model: "Dingdan", |
||||
|
// 客户编号 简称 客户名称 客户产品名称 产品代码 S6产品名称 最小单位条码 销售数量 修改后销售数量 销售金额 最高采购价 箱装量 最大箱装量 规格型号 计量单位 箱条码 最大箱条码 |
||||
|
} |
||||
|
if (this.searchParams.kehubianhao) { |
||||
|
params["kehubianhao"] = this.searchParams.kehubianhao |
||||
|
} |
||||
|
window.electron.ipcRenderer.send('exportData', params) |
||||
|
}, |
||||
|
//导出S6 |
||||
|
exportS6data() { |
||||
|
let params = { |
||||
|
subType: "exportS6", |
||||
|
url: "/api/exportDingdanInfo", |
||||
|
model: "Dingdan", |
||||
|
// 客户编号 简称 客户名称 客户产品名称 产品代码 S6产品名称 最小单位条码 销售数量 修改后销售数量 销售金额 最高采购价 箱装量 最大箱装量 规格型号 计量单位 箱条码 最大箱条码 |
||||
|
} |
||||
|
if (this.searchParams.kehubianhao) { |
||||
|
params["kehubianhao"] = this.searchParams.kehubianhao |
||||
|
} |
||||
|
window.electron.ipcRenderer.send('exportData', params) |
||||
|
}, |
||||
|
//处理销售订单的导出数据 |
||||
|
dealexportxiaoshou(list) { |
||||
|
let lilstLocal = [] |
||||
|
let allMoney = 0 |
||||
|
for (let i = 0; i < list.length; i++) { |
||||
|
let item = list[i]; |
||||
|
let listItem = {} |
||||
|
allMoney += item.xiaoshoujine |
||||
|
for (let j = 0; j < this.exportxiaoshou.length; j++) { |
||||
|
let headerItem = this.exportxiaoshou[j]; |
||||
|
listItem[headerItem.label] = item[headerItem.prop] |
||||
|
} |
||||
|
lilstLocal.push(listItem) |
||||
|
} |
||||
|
lilstLocal.push({ "销售金额": allMoney }) |
||||
|
let jsonWorkSheet = this.$XLSX.utils.json_to_sheet(lilstLocal); |
||||
|
let workBook = { |
||||
|
SheetNames: ["sheet1"], |
||||
|
Sheets: { |
||||
|
["sheet1"]: jsonWorkSheet, |
||||
|
} |
||||
|
}; |
||||
|
return this.$XLSX.writeFile(workBook, `销售订单${dayjs().format("YYYY-MM-DD_HH-mm-ss")}.xlsx`); |
||||
|
}, |
||||
|
//导出S6 |
||||
|
dealexportS6(list) { |
||||
|
let lilstLocal = [] |
||||
|
let allMoney = 0 |
||||
|
for (let i = 0; i < list.length; i++) { |
||||
|
let item = list[i]; |
||||
|
let listItem = {} |
||||
|
allMoney += item.danjudanweishuliang |
||||
|
for (let j = 0; j < this.exportS6.length; j++) { |
||||
|
let headerItem = this.exportS6[j]; |
||||
|
listItem[headerItem.label] = item[headerItem.prop] |
||||
|
} |
||||
|
lilstLocal.push(listItem) |
||||
|
} |
||||
|
lilstLocal.push({ "单据单位数量": allMoney }) |
||||
|
let jsonWorkSheet = this.$XLSX.utils.json_to_sheet(lilstLocal); |
||||
|
let workBook = { |
||||
|
SheetNames: ["sheet1"], |
||||
|
Sheets: { |
||||
|
["sheet1"]: jsonWorkSheet, |
||||
|
} |
||||
|
}; |
||||
|
return this.$XLSX.writeFile(workBook, `S6订单${dayjs().format("YYYY-MM-DD_HH-mm-ss")}.xlsx`); |
||||
|
}, |
||||
|
|
||||
|
}, |
||||
|
async mounted() { |
||||
|
this.tableHeader = _.filter(tableHeaderLocal, o => o.tableShow) |
||||
|
this.formHeader = _.filter(tableHeaderLocal, o => o.formShow) |
||||
|
this.exportxiaoshou = _.filter(tableHeaderLocal, o => o.exportxiaoshou) |
||||
|
this.exportS6 = _.filter(tableHeaderLocal, o => o.exportS6) |
||||
|
this.initInfo() |
||||
|
this.exportData() |
||||
|
await this.updateSeach() |
||||
|
}, |
||||
|
|
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.rightClass { |
||||
|
padding: 0 8px 0 0; |
||||
|
} |
||||
|
|
||||
|
.uploadClass { |
||||
|
top: 3px; |
||||
|
} |
||||
|
|
||||
|
.inputClass { |
||||
|
display: inline-block; |
||||
|
margin: 0 8px; |
||||
|
position: relative; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,359 @@ |
|||||
|
<template> |
||||
|
<div class="rightClass"> |
||||
|
<div style="margin:0 0 8px 0"> |
||||
|
<el-button type="primary" @click="addData"> |
||||
|
<el-icon> |
||||
|
<Plus /> |
||||
|
</el-icon> |
||||
|
<span>新增</span> |
||||
|
</el-button> |
||||
|
<el-button type="danger" @click="deleteData(selectionData)" :disabled="selectionData.length == 0"> |
||||
|
<el-icon> |
||||
|
<Delete /> |
||||
|
</el-icon> |
||||
|
<span>删除</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass uploadClass"> |
||||
|
<el-upload :show-file-list="false" v-model="fileOriData" :before-upload="beforeAvatarUpload" |
||||
|
:http-request="successSubmit" accept=".xls,.xlsx,.csv"> |
||||
|
<el-button type="success"> |
||||
|
<el-icon> |
||||
|
<Upload /> |
||||
|
</el-icon> |
||||
|
<span>上传</span> |
||||
|
</el-button> |
||||
|
</el-upload> |
||||
|
</div> |
||||
|
<el-button type="primary" @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Refresh /> |
||||
|
</el-icon> |
||||
|
<span>刷新</span> |
||||
|
</el-button> |
||||
|
<div class="inputClass"> |
||||
|
<el-input v-model="searchParams.usercode" style="max-width: 600px" placeholder="请输入客户编号" clearable |
||||
|
@clear="searchData" @keyup.enter="searchData"> |
||||
|
<template #append> |
||||
|
<el-button @click="searchData"> |
||||
|
<el-icon> |
||||
|
<Search /> |
||||
|
</el-icon> |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-input> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div> |
||||
|
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :pageSizes="pageSizes" :total="total" |
||||
|
@selectChange="selectChange" @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange" |
||||
|
@edit="edit" @info="info" @del="del"> |
||||
|
</tablecomponent> |
||||
|
</div> |
||||
|
<el-dialog v-model="dialogFrom.visible" :title="dialogFrom.title" width="80%"> |
||||
|
<formcomponent :formHeader="dialogFrom.formHeader" :formData="dialogFrom.formData" |
||||
|
:disabled="dialogFrom.disabled"> |
||||
|
</formcomponent> |
||||
|
<template #footer> |
||||
|
<div> |
||||
|
<el-button @click="cancelDialog">取消</el-button> |
||||
|
<el-button type="primary" @click="submitDialog"> 确认 </el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import _ from 'lodash' |
||||
|
import tableHeaderLocal from '../assets/json/user.json' |
||||
|
import dayjs from 'dayjs' |
||||
|
import tablecomponent from "../components/tablecomponent.vue" |
||||
|
import formcomponent from "../components/formcomponent.vue" |
||||
|
import { ElMessage, ElMessageBox } from 'element-plus' |
||||
|
export default { |
||||
|
name: 'user', |
||||
|
components: { tablecomponent, formcomponent }, |
||||
|
data() { |
||||
|
return { |
||||
|
_: _, |
||||
|
dayjs: dayjs, |
||||
|
tableHeader: [], |
||||
|
formHeader: [], |
||||
|
tableData: [], |
||||
|
currentPage: 1, |
||||
|
pageSize: 16, |
||||
|
pageSizes: [16, 50, 100, 200], |
||||
|
total: 0, |
||||
|
searchParams: { |
||||
|
usercode: "" |
||||
|
}, |
||||
|
selectionData: [], |
||||
|
dialogFrom: { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
}, |
||||
|
fileOriData: [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
/** |
||||
|
* 上传表格检查 |
||||
|
*/ |
||||
|
beforeAvatarUpload(rawFile) { |
||||
|
let imgList = ['text/csv', 'application/vnd.ms-excel', "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] |
||||
|
if (imgList.indexOf(rawFile.type) === -1) { |
||||
|
this.$msgbox.alert('请上传excel,csv格式的表格文件!') |
||||
|
return false |
||||
|
} else if (rawFile.size / 1024 / 1024 > 50) { |
||||
|
this.$msgbox.alert('表格文件的大小为小于50MB,数据过多时会处理过慢') |
||||
|
return true |
||||
|
} |
||||
|
return true |
||||
|
}, |
||||
|
//表格增加数据 |
||||
|
async successSubmit(opts) { |
||||
|
let that = this |
||||
|
let file = opts.file |
||||
|
this.fileDealData = [] |
||||
|
let fileReader = new FileReader() |
||||
|
fileReader.onload = async function () { |
||||
|
let data = this.result |
||||
|
let workbook = that.$XLSX.read(data, { type: 'binary' }) |
||||
|
let sheetName = workbook.SheetNames[0] |
||||
|
let sheetData = that.$XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]) |
||||
|
let list = [] |
||||
|
for (let i = 0; i < sheetData.length; i++) { |
||||
|
let element = sheetData[i]; |
||||
|
let item = {} |
||||
|
for (let j = 0; j < that.tableHeader.length; j++) { |
||||
|
let headerItem = that.tableHeader[j]; |
||||
|
if (element[headerItem.label]) { |
||||
|
if (headerItem.type === "text") { |
||||
|
item[headerItem.prop] = element[headerItem.label] |
||||
|
} else if (headerItem.type === "number") { |
||||
|
item[headerItem.prop] = Number(element[headerItem.label]) |
||||
|
} else if (headerItem.type === "date") { |
||||
|
item[headerItem.prop] = dayjs(element[headerItem.label]).format("YYYY-MM-DD HH:mm:ss") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
list.push(item) |
||||
|
} |
||||
|
let params = { |
||||
|
subType: "multi", |
||||
|
url: "/api/userInfo", |
||||
|
list |
||||
|
} |
||||
|
ElMessage({ |
||||
|
message: "数据处理中", |
||||
|
type: 'success' |
||||
|
}) |
||||
|
await that.updateSeach(params) |
||||
|
setTimeout(() => { |
||||
|
that.updateSeach() |
||||
|
}, 1500); |
||||
|
} |
||||
|
fileReader.onerror = function (error) { |
||||
|
console.error('Error reading file:', error) |
||||
|
} |
||||
|
fileReader.readAsArrayBuffer(file) |
||||
|
}, |
||||
|
//初始化数据 |
||||
|
initInfo() { |
||||
|
let that = this |
||||
|
window.electron.ipcRenderer.on('userInfo', (eve, str) => { |
||||
|
that.tableData = [] |
||||
|
if (str.hasError) { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'error' |
||||
|
}) |
||||
|
} else { |
||||
|
if (str.msg !== "查询成功") { |
||||
|
ElMessage({ |
||||
|
message: str.msg, |
||||
|
type: 'success', |
||||
|
grouping: true |
||||
|
}) |
||||
|
} |
||||
|
if (_.isArray(str.list)) { |
||||
|
that.tableData = str.list |
||||
|
} else if (_.isObject(str.list)) { |
||||
|
that.tableData = [str.list] |
||||
|
} |
||||
|
that.total = str.count |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
//更新数据 |
||||
|
async updateSeach(params = {}) { |
||||
|
let localParams = { |
||||
|
subType: "get", |
||||
|
url: "/api/userInfo", |
||||
|
pageSize: this.pageSize, |
||||
|
currentPage: this.currentPage, |
||||
|
...params, |
||||
|
} |
||||
|
window.electron.ipcRenderer.send('sendMessage', localParams) |
||||
|
}, |
||||
|
//搜索数据 |
||||
|
async searchData() { |
||||
|
let params = {} |
||||
|
if (this.searchParams.usercode) { |
||||
|
params["usercode"] = this.searchParams.usercode |
||||
|
} |
||||
|
this.updateSeach(params) |
||||
|
}, |
||||
|
//选中数据 |
||||
|
selectChange(selection) { |
||||
|
this.selectionData = _.cloneDeep(selection) |
||||
|
}, |
||||
|
//当前页 |
||||
|
async handleCurrentChange(currentPage) { |
||||
|
this.currentPage = currentPage |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//分页 |
||||
|
async handleSizeChange(pageSize) { |
||||
|
this.pageSize = pageSize |
||||
|
await this.searchData() |
||||
|
}, |
||||
|
//关闭模态框 |
||||
|
cancelDialog() { |
||||
|
this.dialogFrom = { |
||||
|
visible: false, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
formHeader: [], |
||||
|
formData: {} |
||||
|
} |
||||
|
}, |
||||
|
//确认模态框 |
||||
|
async submitDialog() { |
||||
|
let postMethod = ["add", "multi", "edit", "get", "del"] |
||||
|
if (postMethod.indexOf(this.dialogFrom.type) !== -1) { |
||||
|
let params = { |
||||
|
subType: this.dialogFrom.type, |
||||
|
url: "/api/userInfo", |
||||
|
list: [{ ...this.dialogFrom.formData }] |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await setTimeout(async () => { |
||||
|
await this.searchData() |
||||
|
}, 500); |
||||
|
} |
||||
|
this.cancelDialog() |
||||
|
}, |
||||
|
//打开新增模态框 |
||||
|
addData() { |
||||
|
let formData = {} |
||||
|
for (let i = 0; i < this.formHeader.length; i++) { |
||||
|
let element = this.formHeader[i]; |
||||
|
if (element.type === "text") { |
||||
|
formData[element.prop] = "" |
||||
|
} else if (element.type === "date") { |
||||
|
formData[element.prop] = dayjs().format("YYYY-MM-DD") |
||||
|
} else if (element.type === "number") { |
||||
|
formData[element.prop] = 0 |
||||
|
} |
||||
|
} |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "新增用户", |
||||
|
type: "add", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData |
||||
|
} |
||||
|
}, |
||||
|
//打开编辑数据模态框 |
||||
|
edit(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "编辑用户", |
||||
|
type: "edit", |
||||
|
disabled: false, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//打开查看数据模态框 |
||||
|
info(row) { |
||||
|
this.dialogFrom = { |
||||
|
visible: true, |
||||
|
title: "查看用户", |
||||
|
type: "info", |
||||
|
disabled: true, |
||||
|
formHeader: this.formHeader, |
||||
|
formData: { ...row } |
||||
|
} |
||||
|
}, |
||||
|
//删除数据 |
||||
|
del(row) { |
||||
|
this.deleteData([row]) |
||||
|
}, |
||||
|
//批量删除数据 |
||||
|
deleteData(delList) { |
||||
|
let tooltipList = [] |
||||
|
let idList = [] |
||||
|
for (let i = 0; i < delList.length; i++) { |
||||
|
let element = delList[i]; |
||||
|
tooltipList.push(element.username) |
||||
|
idList.push(element._id) |
||||
|
} |
||||
|
ElMessageBox.confirm( |
||||
|
`是否删除(${_.join(tooltipList, ",")})?`, |
||||
|
'danger', |
||||
|
{ |
||||
|
confirmButtonText: '确认', |
||||
|
cancelButtonText: '取消', |
||||
|
type: 'danger', |
||||
|
} |
||||
|
) |
||||
|
.then(async () => { |
||||
|
let params = { |
||||
|
subType: "del", |
||||
|
url: "/api/userInfo", |
||||
|
ids: idList, |
||||
|
} |
||||
|
await this.updateSeach(params) |
||||
|
await this.searchData() |
||||
|
}) |
||||
|
.catch(() => { |
||||
|
ElMessage({ |
||||
|
type: 'info', |
||||
|
message: '取消删除', |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
async mounted() { |
||||
|
this.tableHeader = _.filter(tableHeaderLocal, o => o.tableShow) |
||||
|
this.formHeader = _.filter(tableHeaderLocal, o => o.formShow) |
||||
|
this.initInfo() |
||||
|
await this.updateSeach() |
||||
|
}, |
||||
|
|
||||
|
watch: {}, |
||||
|
computed: {} |
||||
|
} |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.rightClass { |
||||
|
padding: 0 8px 0 0; |
||||
|
} |
||||
|
|
||||
|
.uploadClass { |
||||
|
top: 3px; |
||||
|
} |
||||
|
|
||||
|
.inputClass { |
||||
|
display: inline-block; |
||||
|
margin: 0 8px; |
||||
|
position: relative; |
||||
|
} |
||||
|
</style> |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue