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 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"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": {
"version": "8.0.1",
"resolved": "https://repo.huaweicloud.com/repository/npm/ssri/-/ssri-8.0.1.tgz",
......@@ -1851,6 +1897,41 @@
"requires": {
"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 @@
}
}
},
"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": {
"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",
......
.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
const ReconciledBill = resolve => require(['@/views/billManagement/reconciledBill.vue'], resolve);
const ReconciledBillDetail = resolve => require(['@/views/billManagement/reconciledBillDetail.vue'], resolve);
const AllPayableBills = resolve => require(['@/views/billManagement/allPayableBills.vue'], resolve);
const fileManagement = resolve => require(['@/views/billManagement/fileManagement.vue'], resolve);
const routes = [
{path: '/', name: 'Index', meta: {title: '概况'}, component: Home},
......@@ -87,6 +88,7 @@ const routes = [
{path: '/reconciledBill', name: 'reconciledBill', meta: {title: '对账单'}, component: ReconciledBill},
{path: '/reconciledBillDetail', name: 'reconciledBillDetail', meta: {title: '对账单详情'}, component: ReconciledBillDetail},
{path: '/allPayableBills', name: 'allPayableBills', meta: {title: '全部应付单'}, component: AllPayableBills},
{path: '/fileManagement', name: 'fileManagement', meta: {title: '文件管理'}, component: fileManagement},
{path: '*', redirect: '/'}
]
......
......@@ -34,52 +34,69 @@
<el-select v-model="selectedLang" placeholder="" style="margin-left:10px;width: 5%;">
<el-option v-for="option in langOptions" :label="option.label" :value="option.value" :key="option.value"></el-option>
</el-select>
</div>
<div class="data-box th-all" style="margin-bottom:20px;">
<el-table :data="contractData" border>
<el-table-column prop="languageType" label="语言" min-width="30"></el-table-column>
<el-table-column prop="contractSn" label="合同编号" min-width="100"></el-table-column>
<el-table-column prop="contractBuildTime" label="生成时间" min-width="80"></el-table-column>
<el-table-column label="合同附件" min-width="150">
<el-table-column prop="languageType" label="语言" width="50"></el-table-column>
<el-table-column prop="contractSn" label="合同编号" width="156" :show-overflow-tooltip="true"></el-table-column>
<el-table-column label="合同附件" min-width="100">
<template slot-scope="scope">
<el-link v-if="scope.row.contractFileUrl!=''" :href=" scope.row.contractFileUrl " target="_blank">{{ scope.row.contractFileUrl }}</el-link>
<el-link v-if="scope.row.contractFileUrl != ''" :href="scope.row.contractFileUrl" target="_blank">查看</el-link>
</template>
</el-table-column>
<el-table-column prop="contractReturnDate" label="回传时间" width="150"></el-table-column>
<el-table-column prop="createName" label="上传人" width="120"></el-table-column>
<el-table-column fixed="right" label="操作" width="150" align="center">
<el-table-column prop="contractBuildTime" label="生成时间" width="160"></el-table-column>
<el-table-column prop="createName" label="上传人" width="160"></el-table-column>
<el-table-column prop="contractReturnDate" label="回传时间" width="160"></el-table-column>
<el-table-column prop="sign_time_val" label="签署时间" width="160"></el-table-column>
<el-table-column prop="sign_status_val" label="签署状态" width="160"></el-table-column>
<el-table-column prop="statusValue" label="状态" width="80">
<template slot-scope="scope">
<!-- 订单状态不是“完成,作废”,合同状态为有效 -->
<!-- 采购组织为“深贸电子”时,下载猎芯合同有中文,英文两种选择;列表有中文,英文两行,列表按钮分别为“上传PI,上传合同” -->
<div v-if="infos.company_id==2 && infos.status!=4 && infos.status!=-3 && scope.row.status ==1">
<el-button type="primary" v-if=" scope.row.contractFileUrl!='' " @click="delContract(scope.row)" >
<span>删除合同</span>
</el-button>
<el-upload v-else-if=" scope.row.languageType=='中文' " :headers="{ Authorization: 'Bearer ' + token }" :data="{supplier_id:supplier_id,contract_id:scope.row.contractId,type:'upload'}" :action="uploadUrl" :on-success="handleUploadSuccess" >
<template v-if="scope.row.status == -1">
<span>{{ scope.row.statusValue }}</span>
<el-tooltip :aa="scope" class="item" effect="dark" placement="top-start">
<i class="el-icon-question" style="color:#ff7e11;margin-left:5px;cursor:pointer;font-size:16px;"></i>
<div slot="content">{{ scope.row.invalidate_reason }}</div>
</el-tooltip>
</template>
<span v-else>{{ scope.row.statusValue }}</span>
</template>
</el-table-column>
<el-table-column prop="expire_time_val" label="失效时间" width="145"></el-table-column>
<el-table-column prop="contract_type_val" label="类型" width="120"></el-table-column>
<el-table-column fixed="right" label="操作" width="120" align="center">
<template slot-scope="scope">
<el-row>
<!-- 电子签 -->
<template v-if="scope.row.contract_type == 2">
<!-- 签署状态为待签署+状态为有效 -->
<el-button type="primary" @click="showSignDialog(scope.row)" v-if="scope.row.status == 1 && scope.row.sign_status == 2">签署合同</el-button>
</template>
<!-- 人工签 -->
<template v-else>
<!-- 深贸电子 -->
<template v-if="infos.company_id == 2 && infos.status != 4 && infos.status != -3 && scope.row.status == 1">
<el-button v-if="scope.row.contractFileUrl" type="primary" @click="delContract(scope.row)">删除</el-button>
<el-upload v-else-if="scope.row.languageType == '中文'" :headers="{ Authorization: 'Bearer ' + token }" :data="getUploadData(scope.row)" :action="uploadUrl" :on-success="handleUploadSuccess">
<el-button type="primary">上传PI</el-button>
</el-upload>
<el-upload v-else-if=" scope.row.languageType=='英文' " :headers="{ Authorization: 'Bearer ' + token }" :data="{supplier_id:supplier_id,contract_id:scope.row.contractId,type:'upload'}" :action="uploadUrl" :on-success="handleUploadSuccess" >
<el-upload v-else-if="scope.row.languageType == '英文'" :headers="{ Authorization: 'Bearer ' + token }" :data="getUploadData(scope.row)" :action="uploadUrl" :on-success="handleUploadSuccess">
<el-button type="primary">上传合同</el-button>
</el-upload>
</div>
<!-- 采购组织为“猎芯科技”时,下载猎芯合同只能选择中文,列表也只有中文一行,列表按钮为“上传合同” -->
<div v-if="infos.company_id==1 && infos.status!=4 && infos.status!=-3 && scope.row.status ==1">
<el-button type="primary" v-if=" scope.row.contractFileUrl!='' " @click="delContract(scope.row)" >
<span>删除合同</span>
</el-button>
<el-upload v-else-if=" scope.row.languageType=='中文' " :headers="{ Authorization: 'Bearer ' + token }" :data="{supplier_id:supplier_id,contract_id:scope.row.contractId,type:'upload'}" :action="uploadUrl" :on-success="handleUploadSuccess" >
</template>
<!-- 猎芯科技 -->
<template v-else-if="infos.company_id == 1 && infos.status != 4 && infos.status != -3 && scope.row.status == 1">
<el-button v-if="scope.row.contractFileUrl" type="primary" @click="delContract(scope.row)">删除</el-button>
<el-upload v-else-if="scope.row.languageType == '中文'" :headers="{ Authorization: 'Bearer ' + token }" :data="getUploadData(scope.row)" :action="uploadUrl" :on-success="handleUploadSuccess">
<el-button type="primary">上传合同</el-button>
</el-upload>
</div>
</template>
</template>
</el-row>
</template>
</el-table-column>
</el-table>
</div>
<!-- 型号明细 -->
<div class="xktitle" style="margin-bottom:20px;">型号明细</div>
<div class="data-box th-all" v-if="tableData">
<el-table :data="tableData" border>
......@@ -96,21 +113,226 @@
</el-table>
</div>
</div>
<Menu/>
<!-- 签署合同弹窗 -->
<el-dialog title="签署合同" :visible.sync="signDialogVisible" width="900px" :before-close="closeSignDialog">
<div class="sign-contract-content" @scroll="handleScroll" ref="contractContent">
<div class="title column rowCenter verCenter">
<h2>{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyACompanyName || '' }}</h2>
<h4>采购合同</h4>
</div>
<table class="sign-table norder sign-table-left">
<tr>
<td style="position: relative;">
<span class="label letter">编号:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.purchaseNum || '' }}</span>
<i class="company-logo" v-if="signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.companyId == 1"></i>
</td>
<td>
<span class="label letter">日期:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.date || '' }}</span>
</td>
</tr>
<tr>
<td>
<span class="label letter">甲方:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyACompanyName || '' }}</span>
</td>
<td>
<span class="label letter">乙方:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBCompanyName || '' }}</span>
</td>
</tr>
<tr>
<td>
<span class="label">联系人:</span>
<span class="value-text">&nbsp;{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyAContactName || '' }}</span>
</td>
<td>
<span class="label">联系人:</span>
<span class="value-text">&nbsp;{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBContactName || '' }}</span>
</td>
</tr>
<tr>
<td>
<span class="label letter">地址:</span>
<span class="value-text">深圳市龙岗区坂田街道清丽路1号宝能科技园12栋11楼</span>
</td>
<td>
<span class="label letter">地址:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBAddress || '' }}</span>
</td>
</tr>
<tr v-if="signContractData.pdfInfo">
<td style="position: relative;">
<span class="label letter">电话:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyATel || '' }}</span>
<template v-if="signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.companyId == 1">
<i class="stamp"></i>
</template>
<template v-else>
<i class="stamp-hk"></i>
</template>
</td>
<td>
<span class="label letter">电话:</span>
<span class="value-text">{{ signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBTel || '' }}</span>
</td>
</tr>
</table>
<table class="sign-table" v-if="signContractData.pdfInfo">
<tr>
<th>项次</th>
<th>物料名称</th>
<th>品牌</th>
<th>数量</th>
<th>批次</th>
<th>单价</th>
<th>金额</th>
<th>交货日期</th>
<th>入仓单号</th>
<th>备注</th>
</tr>
<tr v-for="(item, index) in signContractData.pdfInfo.itemList" :key="index">
<td>{{ item.index }}</td>
<td>{{ item.goodsName }}</td>
<td>{{ item.brandName }}</td>
<td>{{ item.purchaseQty }}</td>
<td>{{ item.dateCode }}</td>
<td>{{ item.unitPrice }}</td>
<td>{{ item.price }}</td>
<td>{{ item.estimatDeliveryTime }}</td>
<td>{{ item.warehouseReceiptSn }}</td>
<td>{{ item.frqRemark }}</td>
</tr>
</table>
<p class="row total" v-if="signContractData.pdfInfo">
<span>合计({{ signContractData.pdfInfo.currencyType }}):{{ signContractData.pdfInfo.itemPriceTotal }}</span>
</p>
<div class="sign-text">
<p><b>交易条款:</b></p>
<p>
一、<b>交货地点:深圳市龙岗区坂田街道清丽路1号宝能科技园南区12栋10楼(送货时,请备注入仓单号)</b><br>
<b style="margin-left: 26px;">发票邮寄地址:深圳市龙岗区坂田街道清丽路1号宝能科技园南区12栋11楼</b>
</p>
<p>
二、付款方式: 预付款。 三、发货方式: 包邮 货交甲方验收合格前,风险由乙方承担。
</p>
<p>
四、以上价格为含税人民币价格,提供13%增值税专用发票。
</p>
<p>
五、【品质要求】:<br>
1. 乙方供应的产品,各项指标均符合产品制造商的技术指标。甲方验收或使用过程中,实际测试参数与规格书参数不一样的,甲方有权进行批
量退货;给甲方造成其他损失的,乙方还应当赔偿甲方的实际损失。<br>
2. 乙方提供的产品必须与采购合同的料号规格一致,并符合与合同约定协议要求。有任何变更,乙方要及时通知甲方,并经甲方确认接受更
改后执行,否则甲方可以拒收、退货。视情节影响程度,有权要求乙方承担相关的损失赔偿。<br>
3. 乙方保证提供的产品均来源于原厂正规供销体系,产品外观及管脚正常,并保证产品未经使用,没有翻新、更改丝印、更改产品包装的重
要信息(型号、生产日期、产地等)等。产品处于原厂规定的保质期,并符合原厂官方发布的存储(非拆包产品包装耗材不得更改,密封包
装产品需保证未氧化而且湿度处于正常等级)、运输要求。<br>
</p>
<p>
<b>4.要求全新原装,原标签原包装,如整包装,不接受原真空包装破损漏气。</b>
</p>
<p>
六、<b>【交付】:</b><br>
1. 乙方对交付甲方的产品的相关认证必须符合或适用于中国的相关要求。<br>
2. 乙方在双方规定的交期内交货,如遇不可抗力因素导致无法按期交货,需及时与甲方沟通,共同解决交期问题。如乙方交期延迟,每迟延
一日,应按照当期货款的千分之三支付违约金;迟延超过3日的,甲乙双方协商解决,协商不成,甲方有权解除本协议,并要求按照总货款
的30%¥支付违约金。违约金不足以覆盖甲方损失的,甲方有权要求乙方赔偿相关的损失(包括但不限于直接损失、间接损失及因维权产生
的诉讼费、保全费、保全担保/保险费、检测费、鉴定费、律师费、差旅费等费用)。<br>
</p>
<p>
七、<b>【品质问题归责】:</b><br>
1.一旦产生产品品质引起的交易纠纷,乙方需向甲方提供品质追溯的管理办法并协助甲方完成品质问题的认定及追溯。<br>
2.如双方对问题归责方有异议,甲方可依据双方认可的第三方检测机构出具分析报告做出评定,检测费用由过错方承担。<br>
3.自双方确认品质责任之日起,乙方协助甲方处理终端问题,并由甲方向乙方提报损失费用,由乙方对甲方进行经济赔偿。<br>
4.因产品品质问题引起的损失经双方确认,属于乙方责任的,实际发生费用由乙方负责承担。<br>
八、争议解决
如甲乙双方因本协议产生争议,双方应协商解决,协商不成,双方同意由甲方所在地人民法院管辖,适用中国法律(为本协议表述之方便,
不包括香港特别行政区、澳门特别行政区、台湾地区)进行审理。<br>
九、甲乙双方的指定对接人通过甲方商家系统账号发送的订单或者订单确认信息均属于双方合意的重要体现。乙方指定对接人在甲方商家系
统预设电子签名,甲方指定对接人通过商家系统推送电子采购合同给到乙方后,乙方指定对接人通过乙方在甲方商家系统设立的账号以引用
已预设的电子签名、绑定的手机号码以及当天日期的方式点击确认电子采购合同,即构成对订单的有效确认,订单自双方对接人签字确认之
日起生效
</p>
</div>
<table class="sign-table norder sign-table-left" style="margin-top: 30px;" v-if="signContractData.pdfInfo">
<tr>
<td>
<span class="label letter label-width">甲方:</span>
<span class="value-text">{{ signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyACompanyName }}</span>
</td>
<td>
<span class="label letter label-width">乙方:</span>
<span class="value-text">{{ signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBCompanyName }}</span>
</td>
</tr>
<tr>
<td>
<span class="label letter label-width">经办人:</span>
<span class="value-text">{{ signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyAContactName }}</span>
</td>
<td>
<span class="label letter label-width">经办人:</span>
<span class="value-text">{{ signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.partyBContactName }}</span>
</td>
</tr>
<tr>
<td>
<span class="label letter label-width">批准:</span>
<span class="value-text"></span>
</td>
<td>
<span class="label letter label-width">批准:</span>
<span class="value-text"></span>
</td>
</tr>
<tr>
<td style="position: relative;">
<span class="label letter label-width">合同专用章:</span>
<span class="value-text"></span>
<template v-if="signContractData.pdfInfo && signContractData.pdfInfo.orderInfo && signContractData.pdfInfo.orderInfo.companyId == 1">
<i class="stamp"></i>
</template>
<template v-else>
<i class="stamp-hk"></i>
</template>
</td>
<td style="position: relative;">
<span class="label letter label-width">合同专用章:</span>
<span class="value-text"></span>
<div class="seal" v-if="signContractData.to_sign_user_info && signContractData.to_sign_user_info.name">
<p>{{ signContractData.to_sign_user_info.name }}</p>
<p>{{ signContractData.to_sign_user_info.phone }}</p>
<p>{{ signContractData.to_sign_user_info.sign_date }}</p>
</div>
</td>
</tr>
</table>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeSignDialog">取消</el-button>
<el-button type="primary" @click="submitSignContract" :disabled="disabled">确认签署</el-button>
</div>
</el-dialog>
<Menu />
</section>
</template>
<script>
import Vue from 'vue';
import Tool from '../../tool'
import Menu from "@/components/menu.vue";
import {Col, Message, Pagination, Row, Table, TableColumn, Select, Option, Link, Upload} from 'element-ui';
import axios from 'axios';
import {NODE_ENVS} from "../../ajax";
import Vue from 'vue';
import Tool from '../../tool'
import Menu from "@/components/menu.vue";
import { Col, Message, MessageBox, Pagination, Row, Table, TableColumn, Select, Option, Link, Upload, Tooltip, Dialog } from 'element-ui';
import { NODE_ENVS } from "../../ajax";
Vue.prototype.$message = Message;
Vue.use(Pagination);
Vue.use(TableColumn).use(Table).use(Row).use(Col).use(Select).use(Option).use(Link).use(Upload);
export default {
Vue.prototype.$message = Message;
Vue.prototype.$confirm = MessageBox.confirm;
Vue.use(Pagination);
Vue.use(TableColumn).use(Table).use(Row).use(Col).use(Select).use(Option).use(Link).use(Upload).use(Tooltip).use(Dialog);
export default {
name: "orderTrackGoodsDetail",
data() {
return {
......@@ -122,13 +344,16 @@ export default {
contractData: [],
langOptions: [],
selectedLang: '',
uploadUrl: NODE_ENVS + '/api/purContract/updateOrderContract',
contract_id: '',//合同id
fileData: {
token: this.token,
contract_id: 0,
oss_file_id: '',
oss_file_id: ''
},
signDialogVisible: false,
signContractData: {},
disabled: true
};
},
created() {
......@@ -148,30 +373,25 @@ export default {
}
},
methods: {
getData(id) {
this.$http('post', "/api/purchase/purOrderDetail", {
id: id
}).then(res => {
console.log(res);
getData() {
this.$http('post', "/api/purchase/purOrderDetail", { id: this.id }).then(res => {
if (res.code === 0) {
this.infos = res.data.purchase_info;
this.tableData = res.data.purchase_item_list || [];
this.contractData = res.data.pur_contract_list || [];
// 1猎芯科技,2深茂电子
if( this.infos.company_id == 1 ){
if (this.infos.company_id == 1) {
this.langOptions = [
{ label: '中文', value: 1 },
{ label: '中文', value: 1 }
];
this.selectedLang = 1;
}else{
} else {
this.langOptions = [
{ label: '中文', value: 2 },
{ label: '英文', value: 3 },
{ label: '英文', value: 3 }
];
this.selectedLang = 2;
}
} else {
this.$message({
message: res.msg,
......@@ -180,12 +400,11 @@ export default {
}
})
},
handleUploadSuccess(file, fileList) {
if (file.code === 0) {
this.$message({
message: '上传成功',
type: 'success',
type: 'success'
});
window.location.reload();
} else {
......@@ -195,65 +414,166 @@ export default {
});
}
},
//下载猎芯合同
downloadContract() {
// var that = this;
console.log(this.selectedLang);
let pdf_url = ""
if( this.selectedLang == 1 ){
if (this.selectedLang == 1) {
pdf_url = "/api/purContract/pdf";
}
if( this.selectedLang == 2 ){
if (this.selectedLang == 2) {
pdf_url = "/api/purContract/pdfHk";
}
if( this.selectedLang == 3 ){
if (this.selectedLang == 3) {
pdf_url = "/api/purContract/pdfUs";
}
this.$http('get', pdf_url, {
id: this.$route.query.purchase_id
}, true, 'blob').then(res => {
this.$http('get', pdf_url, { id: this.$route.query.purchase_id }, true, 'blob').then(res => {
// 包装成 Blob 对象
const blob = new Blob([res], { type: 'application/pdf' });
// 创建 URL 对象
let pdfUrl = window.URL.createObjectURL(blob);
window.open(pdfUrl, '_blank');
})
},
// 3 删除合同
delContract(contractItem){
// 删除合同
delContract(contractItem) {
this.$http('post', "/api/purContract/updateOrderContract", {
contract_id:contractItem.contractId,
type:'delete',
contract_id: contractItem.contractId,
type: 'delete'
}).then(res => {
console.log(res);
if( res.code === 0 ){
if (res.code === 0) {
this.$message({
message: '删除成功',
type: 'success',
type: 'success'
});
window.location.reload();
}else{
} else {
this.$message({
message: file.msg,
type: 'warning'
});
}
})
},
// 签署合同
showSignDialog(contractItem) {
this.contract_id = contractItem.contractId;
//获取合同信息
this.$http('POST', "/api/purContract/getContractInfo", { contract_id: this.contract_id }).then(res => {
if (res.code === 0) {
this.signContractData = res.data;
this.disabled = true; // 重置按钮状态
this.signDialogVisible = true;
} else {
this.$message.error('获取合同信息失败');
}
})
},
// 关闭签署合同弹窗
closeSignDialog() {
this.signDialogVisible = false;
},
// 提交签署合同
submitSignContract() {
var confirmMessage = '';
if (this.signContractData.isExistsOldContract == 1) {
// 存在已签署+有效+电子签的合同,提示2句话
confirmMessage = `
<div style="text-align: left; padding: 10px;font-size: 14px;">
<div style="color: #FF961C;margin-bottom: 6px;">请注意:</div>
<div style="line-height: 1.5; color: #666;">
1、确认签署后,原合同(合同编号:${this.signContractData.oldContractSn || ''})将自动变为失效状态,以新签署的合同为准;<br>
2、确认签署后,系统将自动生成【姓名+手机号+签署日期】组成的电子签署加盖在合同落款处。
</div>
</div>
`;
} else {
// 不存在已签署+有效+电子签的合同,提示1句话
confirmMessage = `
<div style="text-align: left; padding: 10px;font-size: 14px;">
<div style="color: #FF961C;margin-bottom: 6px;">请注意:</div>
<div style="line-height: 1.5; color: #666;">
确认签署后,系统将自动生成【姓名+手机号+签署日期】组成的电子签署加盖在合同落款处。
</div>
</div>
`;
}
this.$confirm(confirmMessage, '确认签署', {
confirmButtonText: '确定签署',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
customClass: 'sign-confirm-dialog'
}).then(() => {
this.$http('POST', "/api/purContract/signContract", { contract_id: this.contract_id }).then(res => {
if (res.code === 0) {
this.$message({
message: '签署合同成功',
type: 'success',
onClose: () => {
this.signDialogVisible = false;
this.getData();
}
});
} else {
this.$message.error(res.msg || '操作失败');
}
})
}).catch(() => {
// 用户取消签署
});
},
// 监听合同内容滚动事件,滚动到底部时启用签署按钮
handleScroll(event) {
// 如果已经启用按钮,不再检查滚动状态
if (!this.disabled) {
return;
}
var contractContent = this.$refs.contractContent;
// 检查是否滚动到底部
if (contractContent.scrollHeight - contractContent.scrollTop === contractContent.clientHeight) {
this.disabled = false;
}
},
// 获取上传数据
getUploadData(row) {
return {
supplier_id: this.supplier_id,
contract_id: row.contractId,
type: 'upload'
};
}
},
components: {
Menu
}
};
};
</script>
<style scoped>
@import "../../assets/css/goods/goods.min.css";
@import "../../assets/css/goods/goods.min.css";
@import "../../assets/css/public/contract.css";
.el-button--primary.is-disabled,
.el-button--primary.is-disabled:active,
.el-button--primary.is-disabled:focus,
.el-button--primary.is-disabled:hover {
color: #FFF !important;
background-color: #a0cfff !important;
border-color: #a0cfff !important;
}
</style>
<style>
.sign-confirm-dialog {
width: 574px !important;
}
.sign-confirm-dialog .el-message-box {
width: 574px !important;
}
</style>
\ No newline at end of file
......@@ -23,7 +23,7 @@
<!--操作区-->
<div class="operation-area row">
<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>
</div>
<!--列表区-->
......@@ -114,6 +114,7 @@ export default {
name: "enter",
data() {
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') || '',
futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '',
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 @@
<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="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>
<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 {
total: 0,
page: 1,
limit: 10,
list: [],
list: []
};
},
created() {
......@@ -74,7 +75,7 @@ export default {
},
methods: {
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) {
this.detailData = res.data;
this.list = res.data.items.list;
......@@ -126,7 +127,7 @@ export default {
type: 'warning'
}).then(() => {
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) {
this.$message({
message: '操作成功',
......@@ -151,7 +152,7 @@ export default {
this.$message.warning('请输入有效的数量');
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) {
} else {
......
......@@ -31,7 +31,6 @@
</template>
</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="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>
......
......@@ -24,7 +24,7 @@
<div class="operation-area row verCenter bothSide">
<div class="operation-button row verCenter">
<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>
</a>
</div>
......@@ -98,6 +98,7 @@ export default {
name: "consignmentImport",
data() {
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') || '',//现货最高天数
futures_cp_time_day: localStorage.getItem('futures_cp_time_day') || '',//期货最高天数
uploadUrl: NODE_ENVS + '/api/uploadSku/import',//上传接口
......@@ -126,7 +127,7 @@ export default {
},
methods: {
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 => {
if (res.code === 0) {
this.list = res.data.list || [];
......
......@@ -57,8 +57,8 @@
<el-button type="primary" @click="downOut">导出</el-button>
<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" @click="popupEvent(2)">寄售补货</el-button>
<!-- <el-button type="primary" @click="popupEvent(3)">寄售召回</el-button>-->
<el-button type="primary" @click="popupEvent(2)">寄售申请</el-button>
<!--<el-button type="primary" @click="popupEvent(3)">寄售召回</el-button>-->
</div>
<div class="text-tip row verCenter">
<i class="el-icon-warning"></i>
......@@ -511,7 +511,7 @@ export default {
} else {
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 => {
if (res.code === 0) {
this.tableData = res.data.list || [];
......@@ -549,7 +549,7 @@ export default {
cb([]);
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) {
const arr = res.data.list.map(item => ({
value: item.spu_name
......@@ -817,7 +817,7 @@ export default {
type: 'warning'
});
} 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) {
this.$message({
message: '操作成功',
......@@ -840,7 +840,7 @@ export default {
* 获取sku阶梯价格
*/
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) {
this.skuOriginalStepPriceData = res.data.data;
this.goods_id = goods_id;
......@@ -910,7 +910,7 @@ export default {
// 使用reduce将库存数据转换为对象
const stockUpdates = this.kucundata.reduce((acc, item) => ({
...acc,
[item.goods_id]: {stock: item.updateStock}
[item.goods_id]: { stock: item.updateStock }
}), {});
this.$http('post', "/api/sku/updateSku", stockUpdates)
......@@ -965,7 +965,7 @@ export default {
sku_ids = this.multipleSelection.map(obj => {
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) {
this.$message({
message: '操作成功',
......@@ -994,16 +994,16 @@ export default {
return;
}
var html = `
<p style="font-size: 14px;">确定将选择的商品提交寄售补货申请?</p>
<p style="font-size: 14px;">确定将选择的商品提交寄售申请?</p>
<p style="font-size: 14px;color: #FF7E11">确认后请到【寄售申请】菜单编辑申请寄售数量,并提交审核</p>
`
this.$confirm(html, '寄售补货', {
this.$confirm(html, '寄售申请', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true
}).then(() => {
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) {
this.$message({
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