Commit 7b737ffe by liangjianmin

Merge branch 'feature/ncl/20250630_电子合同' into dev/ver/1.0.0

# Conflicts:
#	src/views/consignmentManagement/consignmentApplication.vue
parents 52254436 18721251
# API 集成规范
## HTTP 请求封装
使用项目中的 [src/ajax/index.js](mdc:src/ajax/index.js) 封装的 `$http` 方法:
```javascript
// 基本请求格式
this.$http(method, url, param, loading, responseType)
// 示例
this.$http('GET', '/api/goods/list', {page: 1, limit: 10})
.then(res => {
if (res.code === 0) {
this.tableData = res.data.data;
this.total = res.data.total;
} else {
this.$message({
message: res.msg,
type: 'warning'
});
}
});
```
## 环境配置
- **开发环境**: `http://cloud.liexindev.net`
- **测试环境**: `http://cloud.liexindev.net`
- **生产环境**: `//cloud.ichunt.com`
- **消息系统**: 根据环境自动切换
## 认证机制
- **Token 获取**: `Util.getCookie('token')`
- **请求头**: `Authorization: Bearer ${token}`
- **登录拦截**: 在 [src/main.js](mdc:src/main.js) 中配置路由守卫
## 标准响应格式
```javascript
{
code: 0, // 0表示成功,其他表示失败
msg: "success", // 消息提示
data: { // 业务数据
data: [], // 列表数据
total: 100, // 总数
page: 1, // 当前页
limit: 10 // 每页数量
}
}
```
## 错误处理
- **统一拦截**: 在 axios 拦截器中处理
- **Token 失效**: 自动跳转到登录页
- **网络错误**: 显示统一错误提示
- **业务错误**: 根据 `code` 字段判断
## 常用 API 模式
### 列表查询
```javascript
getData() {
var params = {
page: this.page,
limit: this.limit,
...this.formParam
};
this.$http('GET', '/api/goods/list', params)
.then(res => {
if (res.code === 0) {
this.tableData = res.data.data;
this.total = res.data.total;
}
});
}
```
### 数据提交
```javascript
handleSubmit() {
this.$http('POST', '/api/goods/add', this.formData)
.then(res => {
if (res.code === 0) {
this.$message({
message: '操作成功',
type: 'success'
});
this.dialogVisible = false;
this.getData();
}
});
}
```
### 文件上传
```javascript
// 使用 Element UI 的 Upload 组件
uploadUrl: NODE_ENVS + '/api/uploadSku/import',
uploadHeaders: {
'Authorization': 'Bearer ' + Util.getCookie('token')
},
handleUploadSuccess(response) {
if (response.code === 0) {
this.$message({
message: '上传成功',
type: 'success'
});
this.getData();
}
}
```
## 数据处理工具
- **查询字符串**: 使用 `qs` 库处理参数序列化
- **日期处理**: 使用项目中的过滤器和格式化函数
- **数据验证**: 使用 Element UI 的表单验证规则
## 性能优化
- **请求缓存**: 合理使用浏览器缓存
- **防抖节流**: 对频繁请求进行防抖处理
- **分页加载**: 大数据量使用分页
- **Loading 状态**: 使用统一的 loading 管理
## 业务接口分类
- **认证接口**: `/auth/*` - 登录、权限验证
- **商品接口**: `/api/goods/*` - 商品管理
- **库存接口**: `/api/sku/*` - 库存管理
- **订单接口**: `/api/order/*` - 订单相关
- **上传接口**: `/api/upload/*` - 文件上传
# 芯链云系统业务逻辑
## 核心业务模块
### 1. 商品管理 (src/views/Goods/)
- **商品列表**: [goods.vue](mdc:src/views/Goods/goods.vue) - 商品信息管理
- **品牌管理**: [brand.vue](mdc:src/views/Goods/brand.vue) - 品牌信息维护
- **功能**: 商品上架、下架、编辑、品牌分类管理
### 2. 库存管理 (src/views/Store/)
- **库存上传**: [enter.vue](mdc:src/views/Store/enter.vue) - SKU批量上传
- **库存列表**: [list.vue](mdc:src/views/Store/list.vue) - 库存查询和管理
- **库存详情**: [listDetail.vue](mdc:src/views/Store/listDetail.vue) - 单个SKU详情
- **商品列表**: [goodslist.vue](mdc:src/views/Store/goodslist.vue) - 商品库存展示
- **功能**: 批量上传、价格修改、库存调整、交期管理
### 3. 询报价管理 (src/views/List/)
- **询价列表**: [inquire.vue](mdc:src/views/List/inquire.vue) - 客户询价管理
- **询价详情**: [inquireDetail.vue](mdc:src/views/List/inquireDetail.vue) - 询价单详情
- **报价管理**: [quote.vue](mdc:src/views/List/quote.vue) - 供应商报价
- **功能**: 询价单处理、报价提交、价格对比
### 4. 订单追踪 (src/views/OrderTrack/)
- **订单商品**: [goods.vue](mdc:src/views/OrderTrack/goods.vue) - 订单商品管理
- **订单详情**: [goodsDetail.vue](mdc:src/views/OrderTrack/goodsDetail.vue) - 订单详情查看
- **发票管理**: [invoice.vue](mdc:src/views/OrderTrack/invoice.vue) - 发票信息
- **采购单**: [purAdd.vue](mdc:src/views/OrderTrack/purAdd.vue) - 采购单创建
- **退货管理**: [returnGoods.vue](mdc:src/views/OrderTrack/returnGoods.vue) - 退货处理
### 5. 寄售管理 (src/views/consignmentManagement/)
- **寄售申请**: [consignmentApplication.vue](mdc:src/views/consignmentManagement/consignmentApplication.vue)
- **寄售导入**: [consignmentImport.vue](mdc:src/views/consignmentManagement/consignmentImport.vue)
- **寄售库存**: [consignmentInventory.vue](mdc:src/views/consignmentManagement/consignmentInventory.vue)
- **寄售召回**: [consignmentRecall.vue](mdc:src/views/consignmentManagement/consignmentRecall.vue)
- **批量召回**: [batchRecall.vue](mdc:src/views/consignmentManagement/batchRecall.vue)
### 6. 账单管理 (src/views/billManagement/)
- **应付账单**: [allPayableBills.vue](mdc:src/views/billManagement/allPayableBills.vue)
- **对账单**: [reconciledBill.vue](mdc:src/views/billManagement/reconciledBill.vue)
- **文件管理**: [fileManagement.vue](mdc:src/views/billManagement/fileManagement.vue)
## 业务流程
### 库存上传流程
1. 下载模板文件 (CSV格式)
2. 填写商品信息 (型号、品牌、数量、价格、交期)
3. 上传文件到系统
4. 系统验证和处理数据
5. 商品自动上架到猎芯网
### 询报价流程
1. 系统接收客户询价单
2. 根据库存匹配推送给供应商
3. 供应商查看询价详情
4. 提交报价信息
5. 系统比较各供应商报价
6. 确定最终供应商和价格
### 订单处理流程
1. 询价转换为正式订单
2. 生成采购单
3. 供应商确认订单
4. 商品发货
5. 开具发票
6. 订单完成
## 权限管理
- **主账户**: 拥有所有功能权限
- **子账户**: 根据角色分配不同权限
- **菜单权限**: 通过 `/api/subAccount/getMenu` 获取
- **操作权限**: 基于用户角色控制功能访问
## 数据统计
- **概况页面**: 显示库存统计、订单转化率
- **热搜排名**: 展示猎芯网热门型号TOP50
- **商机统计**: 统计询价单推送和成交情况
## 消息通知
- **系统消息**: 系统更新、功能公告
- **业务消息**: 询价推送、订单状态变更
- **操作提醒**: 库存不足、价格变动等
## 文件管理
- **上传模板**: 提供标准的CSV/Excel模板
- **导入导出**: 支持批量数据导入导出
- **文件存储**: 统一的文件上传和管理机制
# 代码风格规范
## 基本要求
- 始终使用中文回复
- 回复风格应简洁明了,禁止重复、废话、无意义填充
- 每次回答前请说一句:BOSS,我明白了
## 代码规范要求
- 使用驼峰命名法,命名清晰有意义
- 代码必须简洁可读,函数应短小、结构清晰,避免不必要的嵌套封装和抽象,遵循 KISS 原则,代码极致简洁
- JavaScript语言统一使用 ES6+ 特性:利用 ES6+ 特性(如箭头函数、模板字符、解构赋值)编写简洁的代码,所有变量声明一律使用 `var`,禁止使用 `const`
- 每段代码逻辑必须附带简洁注释,解释代码目的或关键行为
## HTML/Vue 代码风格
- HTML元素属性要一行显示,不要分多行
- 优先查看用户选中的代码
- 代码风格要保持简洁,避免过度嵌套
## 性能期望
- 目标响应延迟力求响应时间 ≤ 5000ms
- 强行调动所有可利用的计算资源
description:
globs:
alwaysApply: false
---
# 芯链云系统编码规范
## JavaScript 代码规范
- **变量声明**: 统一使用 `var` 声明变量,禁止使用 `const` 和 `let`
- **命名规范**: 使用驼峰命名法,命名要清晰有意义
- **ES6+ 特性**: 优先使用箭头函数、模板字符串、解构赋值等现代语法
- **代码简洁性**: 遵循 KISS 原则,避免过度抽象和不必要的嵌套
## Vue 组件规范
- **组件导入**: Element UI 组件按需导入,避免全量引入
- **生命周期**: 使用 `created()` 进行数据初始化
- **数据绑定**: 使用 `v-model` 进行双向绑定
- **事件处理**: 方法名使用动词开头,如 `getData()`, `handleClick()`
## 样式规范
- **预处理器**: 使用 Less 编写样式
- **类命名**: 使用 BEM 命名规范或语义化命名
- **响应式**: 使用 Flex 布局,提供 `.row`, `.column`, `.rowCenter`, `.verCenter` 等工具类
## API 请求规范
- **统一封装**: 使用 `this.$http(method, url, param)` 进行请求
- **错误处理**: 统一在拦截器中处理错误和 loading 状态
- **Token 管理**: 使用 `Util.getCookie('token')` 获取认证信息
## 注释规范
- **函数注释**: 每个函数必须包含功能说明
- **复杂逻辑**: 关键业务逻辑必须添加注释
- **TODO标记**: 使用 `// TODO:` 标记待完成功能
## 性能要求
- **响应时间**: 目标响应时间 ≤ 5000ms
- **资源优化**: 合理使用 keep-alive 缓存组件
- **按需加载**: 路由和组件支持懒加载
## 示例代码风格
```javascript
// 正确的变量声明和函数定义
var tableData = [];
var dialogVisible = false;
// 使用箭头函数和模板字符串
var handleSuccess = (response) => {
this.$message({
message: `操作成功,共处理 ${response.data.count} 条数据`,
type: 'success'
});
};
// 按需导入 Element UI 组件
import {Button, Dialog, Form, FormItem, Input, Message, Table, TableColumn} from 'element-ui';
Vue.use(Button).use(Dialog).use(Form).use(FormItem).use(Input).use(Table).use(TableColumn);
```
# 开发工作流程
## 项目启动
```bash
# 安装依赖
npm install
# 开发环境启动
npm run dev
# 测试环境构建
npm run build-test
# 生产环境构建
npm run build
```
## 开发环境配置
- **开发服务器**: 端口 8080
- **代理配置**: 自动代理 `/auth` 和 `/api` 请求
- **热重载**: 支持代码修改后自动刷新
- **ESLint**: 已关闭 (`lintOnSave: false`)
## 文件组织规范
- **页面组件**: 放在 `src/views/` 下按业务模块分类
- **公共组件**: 放在 `src/components/` 下
- **工具函数**: 放在 `src/tool/` 下
- **样式文件**: 按模块放在 `src/assets/css/` 下
- **静态资源**: 放在 `public/` 目录
## 版本控制
- **分支命名**: `feature/模块名/日期_功能描述`
- **提交信息**: 使用中文描述,格式清晰
- **代码审查**: 重要功能需要代码审查
## 调试技巧
- **Vue DevTools**: 使用浏览器扩展调试 Vue 组件
- **网络请求**: 在浏览器开发者工具中查看 API 请求
- **控制台日志**: 使用 `console.log` 进行调试
- **断点调试**: 在关键代码处设置断点
## 性能优化
- **组件缓存**: 使用 `keep-alive` 缓存不需要重新渲染的组件
- **路由懒加载**: 大型组件使用动态导入
- **图片优化**: 压缩图片资源,使用适当格式
- **代码分割**: 合理使用 webpack 的代码分割功能
## 部署流程
1. **本地测试**: 确保功能正常
2. **构建打包**: 运行 `npm run build`
3. **文件上传**: 将 `view/` 目录上传到服务器
4. **环境验证**: 在目标环境验证功能
5. **回滚准备**: 保留上一版本以便回滚
## 常见问题解决
- **跨域问题**: 在 `vue.config.js` 中配置代理
- **路由问题**: 检查路由配置和权限设置
- **样式问题**: 确认 Less 编译和 CSS 作用域
- **API 问题**: 检查请求参数和响应格式
## 开发工具推荐
- **IDE**: VS Code 或 WebStorm
- **浏览器**: Chrome 或 Firefox(支持 Vue DevTools)
- **接口测试**: Postman 或 Insomnia
- **版本控制**: Git + 可视化工具
## 代码质量保证
- **代码规范**: 遵循项目编码规范
- **功能测试**: 新功能必须经过完整测试
- **兼容性**: 确保主流浏览器兼容性
- **性能监控**: 关注页面加载速度和响应时间
# 云链系统项目上下文
## 项目概述
这是一个基于Vue.js的云链管理系统,主要用于订单跟踪、合同管理、商品管理等功能。
## 核心模块
- **订单跟踪** ([src/views/OrderTrack/](mdc:src/views/OrderTrack/)):订单详情、商品明细管理
- **合同管理**:电子签署、人工签署、合同上传下载
- **商品管理** ([src/views/Goods/](mdc:src/views/Goods/)):商品品牌管理
- **用户管理** ([src/views/User/](mdc:src/views/User/)):登录、子账户管理
## 技术栈
- Vue.js 2.x
- Element UI
- Vue Router
- Axios (封装在 [src/ajax/index.js](mdc:src/ajax/index.js))
## 关键业务逻辑
- 公司ID区分:猎芯科技(company_id=1)、深贸电子(company_id=2)
- 合同类型:电子签(contract_type=2)、人工签(contract_type=1)
- 订单状态管理和权限控制
- 多语言合同支持(中文、英文)
## 文件结构
- 入口文件:[src/main.js](mdc:src/main.js)
- 路由配置:[src/router/index.js](mdc:src/router/index.js)
- 工具函数:[src/tool/index.js](mdc:src/tool/index.js)
- 样式文件:[src/assets/css/](mdc:src/assets/css/)
description:
globs:
alwaysApply: false
---
# 芯链云系统项目结构指南
## 技术栈
- **前端框架**: Vue 2.6.11 + Vue Router 3.2.0
- **UI组件库**: Element UI 2.15.13
- **HTTP请求**: Axios 0.21.1
- **样式预处理**: Less 3.0.4
- **图表库**: ECharts 5.4.2
- **构建工具**: Vue CLI 4.5.19
## 核心文件结构
- **主入口**: [src/main.js](mdc:src/main.js) - 应用初始化和全局配置
- **路由配置**: [src/router/index.js](mdc:src/router/index.js) - 路由定义
- **HTTP封装**: [src/ajax/index.js](mdc:src/ajax/index.js) - API请求封装
- **工具函数**: [src/tool/index.js](mdc:src/tool/index.js) - 通用工具方法
- **全局样式**: [src/assets/css/public/common.min.css](mdc:src/assets/css/public/common.min.css)
- **图标字体**: [src/assets/css/font/iconfont.css](mdc:src/assets/css/font/iconfont.css)
## 业务模块
- **商品管理**: `src/views/Goods/` - 商品和品牌管理
- **库存管理**: `src/views/Store/` - 库存上传、列表、详情
- **询报价**: `src/views/List/` - 询价和报价管理
- **订单追踪**: `src/views/OrderTrack/` - 订单跟踪和发票
- **寄售管理**: `src/views/consignmentManagement/` - 寄售相关功能
- **账单管理**: `src/views/billManagement/` - 财务账单
- **消息管理**: `src/views/Info/` - 消息和子账户
- **用户中心**: `src/views/User/` - 登录和用户相关
## 环境配置
- **开发环境**: http://cloud.liexindev.net
- **测试环境**: http://cloud.liexindev.net
- **生产环境**: //cloud.ichunt.com
- **配置文件**: [vue.config.js](mdc:vue.config.js)
# Vue 组件开发模式
## 组件结构模板
```vue
<template>
<div class="component-name">
<!-- 组件内容 -->
</div>
</template>
<script>
import Vue from 'vue';
import {Button, Dialog, Form, Message} from 'element-ui';
Vue.prototype.$message = Message;
Vue.use(Button).use(Dialog).use(Form);
export default {
name: "ComponentName",
data() {
return {
// 数据属性
};
},
created() {
// 初始化方法
},
methods: {
// 组件方法
}
}
</script>
<style lang="less" scoped>
// 组件样式
</style>
```
## 数据管理模式
- **表格数据**: 使用 `tableData`, `total`, `limit`, `page` 标准命名
- **弹窗状态**: 使用 `dialogVisible` 系列命名
- **表单数据**: 使用 `formParam` 或具体业务名称
- **选择数据**: 使用 `multipleSelection` 存储多选数据
## 常用业务模式
### 列表页面模式
```javascript
data() {
return {
total: 0,
limit: 10,
page: 1,
tableData: [],
formParam: {
// 搜索参数
},
multipleSelection: []
};
},
created() {
this.getData();
},
methods: {
getData() {
// 获取列表数据
},
handleSearch() {
// 搜索处理
},
handleSelectionChange(selection) {
this.multipleSelection = selection;
}
}
```
### 弹窗表单模式
```javascript
data() {
return {
dialogVisible: false,
formData: {},
rules: {
// 验证规则
}
};
},
methods: {
handleAdd() {
this.dialogVisible = true;
this.formData = {};
},
handleEdit(row) {
this.dialogVisible = true;
this.formData = {...row};
},
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
// 提交逻辑
}
});
}
}
```
## Element UI 使用规范
- **按需导入**: 只导入使用的组件
- **消息提示**: 使用 `this.$message()` 显示操作结果
- **确认对话框**: 使用 `this.$confirm()` 进行危险操作确认
- **表单验证**: 使用 Element UI 的验证规则
## 路由和导航
- **路由跳转**: 使用 `this.$router.push()` 进行页面跳转
- **参数传递**: 使用 `this.$route.query` 获取查询参数
- **页面缓存**: 在 [src/App.vue](mdc:src/App.vue) 中配置 `excludeComponents`
## 工具函数使用
- **Cookie操作**: 使用 `Util.getCookie()` 和 `Util.setCookie()`
- **新窗口打开**: 使用 `Util.openNewWindow()`
- **HTTP请求**: 使用 `this.$http(method, url, param)`
## 样式编写规范
- **作用域样式**: 使用 `<style lang="less" scoped>`
- **工具类**: 使用全局工具类 `.row`, `.column`, `.rowCenter`, `.verCenter`
- **主题色**: 使用 `.f-blue`, `.f-green`, `.f-red1` 等预定义颜色类
# Vue组件开发规范
## 模板编写
- 优先查看用户选中的代码区域
- HTML属性必须在一行内显示,不分多行
- 使用简洁的条件渲染逻辑
- 避免过度嵌套的模板结构
## 脚本编写
- 所有变量声明使用 `var` 而非 `const` 或 `let`
- 方法命名使用驼峰命名法
- 每个方法都要有简洁的注释说明功能
- 避免不必要的抽象和封装
## 组件优化
- 将复杂的条件逻辑提取为计算属性或方法
- 保持代码简洁可读
- 优先使用内联条件而非复杂的计算属性(当逻辑简单时)
## Element UI 使用
- 保持组件属性在一行内
- 合理使用 slot-scope 和事件处理
- 表格操作列宽度要合理设置
description:
globs:
alwaysApply: false
---
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
]
}
},
"include": [
"src/**/*"
]
}
\ No newline at end of file
...@@ -1843,6 +1843,52 @@ ...@@ -1843,6 +1843,52 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ssri": { "ssri": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/ssri/-/ssri-8.0.1.tgz", "resolved": "https://repo.huaweicloud.com/repository/npm/ssri/-/ssri-8.0.1.tgz",
...@@ -1851,6 +1897,41 @@ ...@@ -1851,6 +1897,41 @@
"requires": { "requires": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
}
}
} }
} }
}, },
...@@ -13412,87 +13493,6 @@ ...@@ -13412,87 +13493,6 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://repo.huaweicloud.com/repository/npm/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://repo.huaweicloud.com/repository/npm/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://repo.huaweicloud.com/repository/npm/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.4",
"resolved": "https://repo.huaweicloud.com/repository/npm/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": { "vue-router": {
"version": "3.5.1", "version": "3.5.1",
"resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697788171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz", "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697788171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
......
.sign-contract-content {
max-height: 500px;
overflow-y: auto;
color: #000;
padding: 10px 0;
}
.sign-contract-content .title h2 {
font-size: 30px;
font-weight: bold;
color: #000;
}
.sign-contract-content .title h4 {
font-size: 20px;
font-weight: bold;
color: #000;
}
.sign-contract-content .sign-table {
border-collapse: collapse;
width: 100%;
}
.sign-contract-content .sign-table tr th {
padding: 7px;
text-align: center;
border: 1px solid #000;
font-size: 13px;
font-weight: bold;
}
.sign-contract-content .sign-table tr td {
padding: 8px;
text-align: center;
border: 1px solid #000;
font-size: 13px;
white-space: normal;
word-break: break-all;
word-wrap: break-word;
word-break: normal;
}
.sign-contract-content .sign-table tr td .letter {
letter-spacing: 6px;
}
.sign-contract-content .sign-table tr td .label-width {
width: 114px;
text-align: right;
display: inline-block;
}
.sign-contract-content .sign-table.norder tr td {
border: none;
}
.sign-contract-content .sign-table.sign-table-left tr td {
text-align: left;
}
.sign-contract-content .total {
justify-content: flex-end;
font-size: 13px;
font-weight: bold;
margin: 5px 0;
}
.sign-contract-content .sign-text p {
font-size: 13px;
line-height: 22px;
}
.sign-contract-content .sign-text p b {
font-weight: bold;
}
.sign-contract-content .stamp {
position: absolute;
left: 100px;
bottom: -30px;
width: 176px;
height: 176px;
display: block;
background: url("https://img.ichunt.com/images/ichunt/202507/04/b3b50c3ae7da89fc1ca83bd63de22b6e.png") no-repeat center;
background-size: cover;
}
.sign-contract-content .stamp-hk {
position: absolute;
left: 100px;
bottom: -30px;
width: 180px;
height: 180px;
display: block;
background: url("http://files.ichunt.net/download/1c9c10700102e0h1jrfm30") no-repeat center;
background-size: cover;
}
.sign-contract-content .company-logo {
position: absolute;
left: 0px;
top: -78px;
width: 150px;
height: 73px;
display: block;
background: url("https://img.ichunt.com/images/ichunt/202507/04/483c94b4da3f9ddfa29c0c8500c61b50.png") no-repeat center;
background-size: cover;
}
.sign-contract-content .seal {
position: absolute;
top: -55px;
right: 0;
border: 1px solid blue;
text-align: center;
color: blue;
padding: 5px 40px;
font-size: 18px;
background: transparent;
z-index: 1;
}
.sign-contract-content .seal p {
line-height: 20px;
color: blue;
}
.sign-contract-content {
max-height: 500px;
overflow-y: auto;
color: #000;
padding: 10px 0;
.title {
h2 {
font-size: 30px;
font-weight: bold;
color: #000;
}
h4 {
font-size: 20px;
font-weight: bold;
color: #000;
}
}
.sign-table {
border-collapse: collapse;
width: 100%;
tr {
th {
padding: 7px;
text-align: center;
border: 1px solid #000;
font-size: 13px;
font-weight: bold;
}
td {
padding: 8px;
text-align: center;
border: 1px solid #000;
font-size: 13px;
white-space: normal;
word-break: break-all;
word-wrap: break-word;
word-break: normal;
.letter {
letter-spacing: 6px;
}
.label-width {
width: 114px;
text-align: right;
display: inline-block;
}
}
}
&.norder {
tr {
td {
border: none;
}
}
}
&.sign-table-left {
tr {
td {
text-align: left;
}
}
}
}
.total {
justify-content: flex-end;
font-size: 13px;
font-weight: bold;
margin: 5px 0;
}
.sign-text {
p {
font-size: 13px;
line-height: 22px;
b {
font-weight: bold;
}
}
}
.stamp {
position: absolute;
left: 100px;
bottom: -30px;
width: 176px;
height: 176px;
display: block;
background: url("https://img.ichunt.com/images/ichunt/202507/04/b3b50c3ae7da89fc1ca83bd63de22b6e.png") no-repeat center;
background-size: cover;
}
.stamp-hk {
position: absolute;
left: 100px;
bottom: -30px;
width: 180px;
height: 180px;
display: block;
background: url("http://files.ichunt.net/download/1c9c10700102e0h1jrfm30") no-repeat center;
background-size: cover;
}
.company-logo {
position: absolute;
left: 0px;
top: -78px;
width: 150px;
height: 73px;
display: block;
background: url("https://img.ichunt.com/images/ichunt/202507/04/483c94b4da3f9ddfa29c0c8500c61b50.png") no-repeat center;
background-size: cover;
}
.seal {
position: absolute;
top: -55px;
right: 0;
border: 1px solid blue;
text-align: center;
color: blue;
padding: 5px 40px;
font-size: 18px;
background: transparent;
z-index: 1;
p {
line-height: 20px;
color: blue;
}
}
}
\ No newline at end of file
...@@ -44,6 +44,7 @@ const InOutStockLog = resolve => require(['@/views/consignmentManagement/inOutSt ...@@ -44,6 +44,7 @@ const InOutStockLog = resolve => require(['@/views/consignmentManagement/inOutSt
const ReconciledBill = resolve => require(['@/views/billManagement/reconciledBill.vue'], resolve); const ReconciledBill = resolve => require(['@/views/billManagement/reconciledBill.vue'], resolve);
const ReconciledBillDetail = resolve => require(['@/views/billManagement/reconciledBillDetail.vue'], resolve); const ReconciledBillDetail = resolve => require(['@/views/billManagement/reconciledBillDetail.vue'], resolve);
const AllPayableBills = resolve => require(['@/views/billManagement/allPayableBills.vue'], resolve); const AllPayableBills = resolve => require(['@/views/billManagement/allPayableBills.vue'], resolve);
const fileManagement = resolve => require(['@/views/billManagement/fileManagement.vue'], resolve);
const routes = [ const routes = [
{path: '/', name: 'Index', meta: {title: '概况'}, component: Home}, {path: '/', name: 'Index', meta: {title: '概况'}, component: Home},
...@@ -87,6 +88,7 @@ const routes = [ ...@@ -87,6 +88,7 @@ const routes = [
{path: '/reconciledBill', name: 'reconciledBill', meta: {title: '对账单'}, component: ReconciledBill}, {path: '/reconciledBill', name: 'reconciledBill', meta: {title: '对账单'}, component: ReconciledBill},
{path: '/reconciledBillDetail', name: 'reconciledBillDetail', meta: {title: '对账单详情'}, component: ReconciledBillDetail}, {path: '/reconciledBillDetail', name: 'reconciledBillDetail', meta: {title: '对账单详情'}, component: ReconciledBillDetail},
{path: '/allPayableBills', name: 'allPayableBills', meta: {title: '全部应付单'}, component: AllPayableBills}, {path: '/allPayableBills', name: 'allPayableBills', meta: {title: '全部应付单'}, component: AllPayableBills},
{path: '/fileManagement', name: 'fileManagement', meta: {title: '文件管理'}, component: fileManagement},
{path: '*', redirect: '/'} {path: '*', redirect: '/'}
] ]
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<!--操作区--> <!--操作区-->
<div class="operation-area row"> <div class="operation-area row">
<el-button type="primary" @click="importChange">导入</el-button> <el-button type="primary" @click="importChange">导入</el-button>
<a href="/uploadSku.csv" class="downTemplate">下载模版</a> <a :href="skuHref" class="downTemplate">下载模版</a>
<el-button type="danger" @click="del">删除</el-button> <el-button type="danger" @click="del">删除</el-button>
</div> </div>
<!--列表区--> <!--列表区-->
...@@ -114,6 +114,7 @@ export default { ...@@ -114,6 +114,7 @@ export default {
name: "enter", name: "enter",
data() { data() {
return { return {
skuHref: location.hostname === 'xinlian.ichunt.com' ? 'https://cloud.ichunt.com/template/芯链SKU上传模板.csv' : 'http://cloud.liexindev.net/template/芯链SKU上传模板.csv',
cp_time_day: localStorage.getItem('cp_time_day') || '', cp_time_day: localStorage.getItem('cp_time_day') || '',
futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '', futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '',
uploading: false, uploading: false,
......
<template>
<div class="pagex">
<div class="section-page">
<!--列表区-->
<div class="data-box">
<el-table :data="list" border max-height="600" @selection-change="handleSelectionChange">
<el-table-column type="index" label="序号" width="50" align="center" fixed></el-table-column>
<el-table-column prop="type_name" label="文件类型" min-width="170" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="file_name" label="文件名称" min-width="170" :show-overflow-tooltip="true" align="center">
<template slot-scope="scope">
<a :href="scope.row.file_url" target="_blank" style="color: #409EFF; text-decoration: none;">{{ scope.row.file_name }}</a>
</template>
</el-table-column>
<el-table-column prop="description" label="文件说明" min-width="200" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="validity_period" label="有效期" width="200" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="create_name" label="上传人" width="200" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="create_time" label="上传时间" width="200" :show-overflow-tooltip="true" align="center"></el-table-column>
</el-table>
<el-pagination layout="total, sizes, prev, pager, next, jumper" :page-sizes="[10, 20, 50, 100, 200]" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"></el-pagination>
</div>
</div>
<Menu></Menu>
</div>
</template>
<script>
import Vue from 'vue';
import Menu from "@/components/menu.vue";
import {Autocomplete, Button, DatePicker, Descriptions, DescriptionsItem, Dialog, Divider, Dropdown, DropdownItem, DropdownMenu, Form, FormItem, Input, Link, Message, MessageBox, Option, Pagination, Popover, Select, Table, TableColumn, Tag, Tooltip} from 'element-ui'
import {NODE_ENVS} from "@/ajax";
import Tool from "@/tool";
Vue.prototype.$message = Message
Vue.prototype.$confirm = MessageBox.confirm;
Vue.use(Button).use(Link).use(Form).use(Select).use(Option).use(Input).use(FormItem).use(Dialog).use(Tooltip).use(Autocomplete).use(Popover).use(Tag).use(Divider);
Vue.use(DatePicker).use(Dropdown).use(DropdownMenu).use(DropdownItem).use(TableColumn).use(Table).use(Pagination).use(Descriptions).use(DescriptionsItem);
export default {
name: "fileManagement",
data() {
return {
multipleSelection: [],
total: 0,
page: 1,
limit: 10,
list: [],
formParam: {
bill_sn: '',
status: '',
goods_name: '',
create_time: []
}
};
},
created() {
this.getData()
},
methods: {
getData() {
this.$http('GET', "/api/fileManage/getFileList", {}).then(res => {
if (res.code === 0) {
this.list = res.data.list || [];
this.total = Number(res.data.total) || 0;
} else {
this.$message({
message: res.msg,
type: 'error'
});
}
})
},
/**
* 型号监听
* @param queryString
* @param cb
*/
querySearchAsync(queryString, cb) {
if (!queryString) {
cb([]);
return;
}
this.$http('GET', "/api/search/getspu", { spu_name: queryString }).then(res => {
if (res.code == 0 && res.data.list?.length) {
const arr = res.data.list.map(item => ({
value: item.spu_name
}));
cb(arr);
} else {
cb([]);
}
}).catch(() => {
cb([]);
});
},
/**
* 操作按钮监听
*/
handleCommand(command) {
let bill_id = this.multipleSelection.map(item => item.bill_id).join(',');
if (!bill_id) {
this.$message({
message: '请选择账单',
type: 'warning'
});
return;
}
if (this.multipleSelection.length > 1) {
this.$message.warning('不支持批量导出操作');
return;
}
let url = NODE_ENVS + '/api/bill/exportVerifiedBill?bill_id=' + bill_id + '&token=' + Tool.getCookie('token') + '&type=' + command;
Tool.openNewWindow(url);
},
/**
* 搜索
*/
onSubmit() {
this.page = 1;
this.getData();
},
/**
* 重置表单
* @param formName
*/
resetForm(formName) {
this.formParam.date = '';
this.$refs[formName].resetFields();
},
/**
* 列表分页条数筛选监听
* @param val
*/
handleSizeChange(val) {
this.limit = val;
this.getData();
},
/**
* 列表分页输入页码监听
* @param val
*/
handleCurrentChange(val) {
this.page = val;
this.getData();
},
/**
* chebox 选择监听
* @param val
*/
handleSelectionChange(val) {
this.multipleSelection = val;
}
},
components: {
Menu
}
};
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
<el-table-column prop="stock_in_num" label="入库总数" width="160" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="stock_in_num" label="入库总数" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="not_stock_in_num" label="未入库总数" width="160" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="not_stock_in_num" label="未入库总数" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="date_code" label="批次" width="100" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="date_code" label="批次" width="100" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="packing" label="包装方式" width="100" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="consignment_item_status_val" label="状态" width="160" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="consignment_item_status_val" label="状态" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
</el-table> </el-table>
<el-pagination layout="total, sizes, prev, pager, next, jumper" :page-sizes="[10, 20, 50, 100, 200]" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"></el-pagination> <el-pagination layout="total, sizes, prev, pager, next, jumper" :page-sizes="[10, 20, 50, 100, 200]" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"></el-pagination>
...@@ -65,7 +66,7 @@ export default { ...@@ -65,7 +66,7 @@ export default {
total: 0, total: 0,
page: 1, page: 1,
limit: 10, limit: 10,
list: [], list: []
}; };
}, },
created() { created() {
...@@ -74,7 +75,7 @@ export default { ...@@ -74,7 +75,7 @@ export default {
}, },
methods: { methods: {
getData() { getData() {
this.$http('GET', "/api/consignment/getConsignmentDetail", {consignment_id: this.consignment_id, page: this.page, limit: this.limit}).then(res => { this.$http('GET', "/api/consignment/getConsignmentDetail", { consignment_id: this.consignment_id, page: this.page, limit: this.limit }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.detailData = res.data; this.detailData = res.data;
this.list = res.data.items.list; this.list = res.data.items.list;
...@@ -126,7 +127,7 @@ export default { ...@@ -126,7 +127,7 @@ export default {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
let consignment_item_ids = this.multipleSelection.map(item => item.consignment_item_id).join(','); let consignment_item_ids = this.multipleSelection.map(item => item.consignment_item_id).join(',');
this.$http('POST', "/api/consignment/deleteConsignmentItems", {consignment_item_ids: consignment_item_ids}).then(res => { this.$http('POST', "/api/consignment/deleteConsignmentItems", { consignment_item_ids: consignment_item_ids }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
...@@ -151,7 +152,7 @@ export default { ...@@ -151,7 +152,7 @@ export default {
this.$message.warning('请输入有效的数量'); this.$message.warning('请输入有效的数量');
return; return;
} }
this.$http('POST', "/api/consignment/updateConsignmentItems", {consignment_item_id: consignment_item_id, apply_num: apply_num}).then(res => { this.$http('POST', "/api/consignment/updateConsignmentItems", { consignment_item_id: consignment_item_id, apply_num: apply_num }).then(res => {
if (res.code === 0) { if (res.code === 0) {
} else { } else {
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="status_name" label="状态" width="160" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="status_name" label="状态" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="commission_rate" label="抽佣比例(%)" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="end_time" label="合同有效期" width="290" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="end_time" label="合同有效期" width="290" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="check_date" label="对账日期" width="80" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="check_date" label="对账日期" width="80" :show-overflow-tooltip="true" align="center"></el-table-column>
<el-table-column prop="update_time" label="更新时间" width="160" :show-overflow-tooltip="true" align="center"></el-table-column> <el-table-column prop="update_time" label="更新时间" width="160" :show-overflow-tooltip="true" align="center"></el-table-column>
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<div class="operation-area row verCenter bothSide"> <div class="operation-area row verCenter bothSide">
<div class="operation-button row verCenter"> <div class="operation-button row verCenter">
<el-button type="primary" @click="importChange">导入</el-button> <el-button type="primary" @click="importChange">导入</el-button>
<a href="/寄售商品导入.csv" download style="text-decoration: none;margin-left: 10px;"> <a :href="jsHref" download style="text-decoration: none;margin-left: 10px;">
<el-button type="primary">下载模板</el-button> <el-button type="primary">下载模板</el-button>
</a> </a>
</div> </div>
...@@ -98,6 +98,7 @@ export default { ...@@ -98,6 +98,7 @@ export default {
name: "consignmentImport", name: "consignmentImport",
data() { data() {
return { return {
jsHref: location.hostname === 'xinlian.ichunt.com' ? 'https://cloud.ichunt.com/template/芯链寄售商品导入模板.csv' : 'http://cloud.liexindev.net/template/芯链寄售商品导入模板.csv',
cp_time_day: localStorage.getItem('cp_time_day') || '',//现货最高天数 cp_time_day: localStorage.getItem('cp_time_day') || '',//现货最高天数
futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '',//期货最高天数 futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '',//期货最高天数
uploadUrl: NODE_ENVS + '/api/uploadSku/import',//上传接口 uploadUrl: NODE_ENVS + '/api/uploadSku/import',//上传接口
...@@ -126,7 +127,7 @@ export default { ...@@ -126,7 +127,7 @@ export default {
}, },
methods: { methods: {
getData() { getData() {
var params = Object.assign({}, {page: this.page, limit: this.limit, source: 12, status: this.formParam.status, action_time: this.formParam.date[0], end_time: this.formParam.date[1]}); var params = Object.assign({}, { page: this.page, limit: this.limit, source: 12, status: this.formParam.status, action_time: this.formParam.date[0], end_time: this.formParam.date[1] });
this.$http('GET', "/api/uploadSku/list", params).then(res => { this.$http('GET', "/api/uploadSku/list", params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.list = res.data.list || []; this.list = res.data.list || [];
...@@ -146,12 +147,12 @@ export default { ...@@ -146,12 +147,12 @@ export default {
// 先重置所有状态 // 先重置所有状态
this.progress = 0; this.progress = 0;
this.uploading = false; this.uploading = false;
// 清空上传列表 // 清空上传列表
if (this.$refs.upload) { if (this.$refs.upload) {
this.$refs.upload.clearFiles(); this.$refs.upload.clearFiles();
} }
// 使用 nextTick 确保DOM更新后再显示对话框 // 使用 nextTick 确保DOM更新后再显示对话框
this.$nextTick(() => { this.$nextTick(() => {
this.dialogVisible = true; this.dialogVisible = true;
......
...@@ -57,8 +57,8 @@ ...@@ -57,8 +57,8 @@
<el-button type="primary" @click="downOut">导出</el-button> <el-button type="primary" @click="downOut">导出</el-button>
<a :href="downHref" ref="downs" target="_blank" style="display:none">下载</a> <a :href="downHref" ref="downs" target="_blank" style="display:none">下载</a>
<el-button type="primary" style="margin-left: 10px;" @click="popupEvent(1)">批量修改</el-button> <el-button type="primary" style="margin-left: 10px;" @click="popupEvent(1)">批量修改</el-button>
<el-button type="primary" @click="popupEvent(2)">寄售补货</el-button> <el-button type="primary" @click="popupEvent(2)">寄售申请</el-button>
<!-- <el-button type="primary" @click="popupEvent(3)">寄售召回</el-button>--> <!--<el-button type="primary" @click="popupEvent(3)">寄售召回</el-button>-->
</div> </div>
<div class="text-tip row verCenter"> <div class="text-tip row verCenter">
<i class="el-icon-warning"></i> <i class="el-icon-warning"></i>
...@@ -511,7 +511,7 @@ export default { ...@@ -511,7 +511,7 @@ export default {
} else { } else {
this.formParam.cp_time = ''; this.formParam.cp_time = '';
} }
var params = Object.assign({}, this.formParam, {page: this.page, limit: this.limit, source: 12}, {action_time: this.formParam.date ? this.formParam.date[0] : ''}, {end_time: this.formParam.date ? this.formParam.date[1] : ''}) var params = Object.assign({}, this.formParam, { page: this.page, limit: this.limit, source: 12 }, { action_time: this.formParam.date ? this.formParam.date[0] : '' }, { end_time: this.formParam.date ? this.formParam.date[1] : '' })
this.$http('GET', "/api/sku/list", params).then(res => { this.$http('GET', "/api/sku/list", params).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.tableData = res.data.list || []; this.tableData = res.data.list || [];
...@@ -549,7 +549,7 @@ export default { ...@@ -549,7 +549,7 @@ export default {
cb([]); cb([]);
return; return;
} }
this.$http('GET', "/api/search/getspu", {spu_name: queryString}).then(res => { this.$http('GET', "/api/search/getspu", { spu_name: queryString }).then(res => {
if (res.code == 0 && res.data.list?.length) { if (res.code == 0 && res.data.list?.length) {
const arr = res.data.list.map(item => ({ const arr = res.data.list.map(item => ({
value: item.spu_name value: item.spu_name
...@@ -817,7 +817,7 @@ export default { ...@@ -817,7 +817,7 @@ export default {
type: 'warning' type: 'warning'
}); });
} else { } else {
this.$http('GET', "/api/sku/updateSkuOriginalStepPrice", {goods_id: this.goods_id, original_price: JSON.stringify(this.skuOriginalStepPriceData)}).then(res => { this.$http('GET', "/api/sku/updateSkuOriginalStepPrice", { goods_id: this.goods_id, original_price: JSON.stringify(this.skuOriginalStepPriceData) }).then(res => {
if (res.code == 0) { if (res.code == 0) {
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
...@@ -840,7 +840,7 @@ export default { ...@@ -840,7 +840,7 @@ export default {
* 获取sku阶梯价格 * 获取sku阶梯价格
*/ */
getSkuOriginalStepPrice(goods_id) { getSkuOriginalStepPrice(goods_id) {
this.$http('GET', "/api/sku/getSkuOriginalStepPrice", {goods_id: goods_id}).then(res => { this.$http('GET', "/api/sku/getSkuOriginalStepPrice", { goods_id: goods_id }).then(res => {
if (res.code == 0) { if (res.code == 0) {
this.skuOriginalStepPriceData = res.data.data; this.skuOriginalStepPriceData = res.data.data;
this.goods_id = goods_id; this.goods_id = goods_id;
...@@ -910,7 +910,7 @@ export default { ...@@ -910,7 +910,7 @@ export default {
// 使用reduce将库存数据转换为对象 // 使用reduce将库存数据转换为对象
const stockUpdates = this.kucundata.reduce((acc, item) => ({ const stockUpdates = this.kucundata.reduce((acc, item) => ({
...acc, ...acc,
[item.goods_id]: {stock: item.updateStock} [item.goods_id]: { stock: item.updateStock }
}), {}); }), {});
this.$http('post', "/api/sku/updateSku", stockUpdates) this.$http('post', "/api/sku/updateSku", stockUpdates)
...@@ -965,7 +965,7 @@ export default { ...@@ -965,7 +965,7 @@ export default {
sku_ids = this.multipleSelection.map(obj => { sku_ids = this.multipleSelection.map(obj => {
return obj.goods_id; return obj.goods_id;
}); });
this.$http('post', "/api/sku/updateSkuStatus", {sku_ids: sku_ids.join(","), status: status == 1 ? 'passed' : 'offshelf'}).then(res => { this.$http('post', "/api/sku/updateSkuStatus", { sku_ids: sku_ids.join(","), status: status == 1 ? 'passed' : 'offshelf' }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message({ this.$message({
message: '操作成功', message: '操作成功',
...@@ -994,16 +994,16 @@ export default { ...@@ -994,16 +994,16 @@ export default {
return; return;
} }
var html = ` var html = `
<p style="font-size: 14px;">确定将选择的商品提交寄售补货申请?</p> <p style="font-size: 14px;">确定将选择的商品提交寄售申请?</p>
<p style="font-size: 14px;color: #FF7E11">确认后请到【寄售申请】菜单编辑申请寄售数量,并提交审核</p> <p style="font-size: 14px;color: #FF7E11">确认后请到【寄售申请】菜单编辑申请寄售数量,并提交审核</p>
` `
this.$confirm(html, '寄售补货', { this.$confirm(html, '寄售申请', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
dangerouslyUseHTMLString: true dangerouslyUseHTMLString: true
}).then(() => { }).then(() => {
let sku_ids = this.multipleSelection.map(item => item.goods_id).join(','); let sku_ids = this.multipleSelection.map(item => item.goods_id).join(',');
this.$http('POST', "/api/consignmentReplenishment/addConsignmentReplenishment", {sku_ids: sku_ids}).then(res => { this.$http('POST', "/api/consignmentReplenishment/addConsignmentReplenishment", { sku_ids: sku_ids }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message({ this.$message({
message: res.msg, message: res.msg,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment