1、新增零售订单批量导入商品接口
This commit is contained in:
parent
3e118b8d5d
commit
17d4131b1d
|
@ -3,12 +3,14 @@ package erpordermanage
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
model "go-admin/app/admin/models"
|
model "go-admin/app/admin/models"
|
||||||
orm "go-admin/common/global"
|
orm "go-admin/common/global"
|
||||||
"go-admin/logger"
|
"go-admin/logger"
|
||||||
"go-admin/tools"
|
"go-admin/tools"
|
||||||
"go-admin/tools/app"
|
"go-admin/tools/app"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -656,3 +658,54 @@ func ErpOrderSaleDetail(c *gin.Context) {
|
||||||
app.OK(c, resp, "")
|
app.OK(c, resp, "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErpOrderBatchImport 批量导入零售数据
|
||||||
|
// @Summary 批量导入零售数据
|
||||||
|
// @Tags 零售订单
|
||||||
|
// @Produce json
|
||||||
|
// @Accept json
|
||||||
|
// @Param file body string true "上传excel文件"
|
||||||
|
// @Success 200 {object} models.ErpOrderBatchImportResp
|
||||||
|
// @Router /api/v1/erp_order/import [post]
|
||||||
|
func ErpOrderBatchImport(c *gin.Context) {
|
||||||
|
file, header, err := c.Request.FormFile("file")
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("form file err:", logger.Field("err", err))
|
||||||
|
app.Error(c, http.StatusInternalServerError, err, "预览失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
readAll, err := io.ReadAll(file)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("read all err:", logger.Field("err", err))
|
||||||
|
app.Error(c, http.StatusInternalServerError, err, "预览失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("header:", header.Filename)
|
||||||
|
_, colsMap, err := model.FileExcelImport(readAll, nil, 4)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("file excel reader err:", err)
|
||||||
|
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("colsMap:", colsMap)
|
||||||
|
if len(colsMap) != 0 {
|
||||||
|
colsMap = colsMap[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
var orderCommodities []model.ErpOrderCommodity
|
||||||
|
orderCommodities, err = model.ImportOrderData(colsMap)
|
||||||
|
if err != nil {
|
||||||
|
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := model.ErpOrderBatchImportResp{
|
||||||
|
Commodities: orderCommodities,
|
||||||
|
}
|
||||||
|
|
||||||
|
app.OK(c, resp, "导入成功")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
@ -439,6 +439,10 @@ type TableData struct {
|
||||||
IMEI string `json:"imei"` // 串码
|
IMEI string `json:"imei"` // 串码
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ErpOrderBatchImportResp struct {
|
||||||
|
Commodities []ErpOrderCommodity `json:"commodities"` // 零售订单商品信息
|
||||||
|
}
|
||||||
|
|
||||||
// Contains 判断id是否在list中
|
// Contains 判断id是否在list中
|
||||||
func Contains(list []uint32, id uint32) bool {
|
func Contains(list []uint32, id uint32) bool {
|
||||||
for _, item := range list {
|
for _, item := range list {
|
||||||
|
|
|
@ -56,6 +56,17 @@ type StockExcel struct {
|
||||||
Count string `json:"count" binding:"required"` // 数量
|
Count string `json:"count" binding:"required"` // 数量
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OrderExcel struct {
|
||||||
|
SerialNum string `json:"serial_num"` // 商品编号
|
||||||
|
Name string `json:"name"` // 商品名称
|
||||||
|
IMEI string `json:"imei"` // 商品串码
|
||||||
|
Count string `json:"count" binding:"required"` // 销售数量
|
||||||
|
StoreName string `json:"store_name" binding:"required"` // 所属门店
|
||||||
|
SalePrice string `json:"sale_price"` // 零售价
|
||||||
|
PresentType string `json:"present_type"` // 是否赠送
|
||||||
|
Remark string `json:"remark"` // 备注
|
||||||
|
}
|
||||||
|
|
||||||
// 获取struct的tag标签,匹配excel导入数据
|
// 获取struct的tag标签,匹配excel导入数据
|
||||||
func getJSONTagNames(s interface{}) []string {
|
func getJSONTagNames(s interface{}) []string {
|
||||||
valueType := reflect.TypeOf(s)
|
valueType := reflect.TypeOf(s)
|
||||||
|
@ -208,6 +219,14 @@ func FileExcelImport(d []byte, cols []string, nType int) ([]byte, []map[string]i
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
cols = getJSONTagNames(StockExcel{})
|
cols = getJSONTagNames(StockExcel{})
|
||||||
|
case 4:
|
||||||
|
if sheetList[0] != "导零售" {
|
||||||
|
return nil, nil, errors.New("格式错误,不是零售模版excel")
|
||||||
|
}
|
||||||
|
if err := checkOrderExcel(sheetCols); err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
cols = getJSONTagNames(OrderExcel{})
|
||||||
default:
|
default:
|
||||||
return nil, nil, errors.New("格式错误,不是商品分类或资料模版excel")
|
return nil, nil, errors.New("格式错误,不是商品分类或资料模版excel")
|
||||||
}
|
}
|
||||||
|
@ -1335,3 +1354,335 @@ func IsExistingCommodity(commodityId uint32) bool {
|
||||||
|
|
||||||
return count > 0
|
return count > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 校验导入零售excel格式
|
||||||
|
// 必填项:商品名称、销售数量
|
||||||
|
// 商品名称和串码是否对应
|
||||||
|
// 串码商品数量只能为1
|
||||||
|
// 是否有库存
|
||||||
|
func checkOrderExcel(sheetCols [][]string) error {
|
||||||
|
if len(sheetCols) != 8 {
|
||||||
|
return errors.New("模版错误,请检查文件")
|
||||||
|
}
|
||||||
|
|
||||||
|
maxLength := findMaxLength(sheetCols)
|
||||||
|
nLow, nMax := determineLowAndMax(sheetCols)
|
||||||
|
|
||||||
|
if nMax < maxLength {
|
||||||
|
return errors.New("第" + strconv.Itoa(nMax+1) + "行商品名称和商品编号不能同时为空")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断是否有重复串码
|
||||||
|
if duplicateName, nFlag := hasDuplicateIMEI(sheetCols[2]); nFlag {
|
||||||
|
return fmt.Errorf("商品串码不允许重复,请检查:[%v]", duplicateName)
|
||||||
|
}
|
||||||
|
|
||||||
|
//先遍历第1列
|
||||||
|
for i := 1; i < nLow; i++ {
|
||||||
|
if sheetCols[0][i] == "" && sheetCols[1][i] == "" { // 商品名称和编号不能都为空
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品名称和商品编号不能同时为空")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 1; i < nMax; i++ {
|
||||||
|
if i < len(sheetCols[1]) {
|
||||||
|
if !IsExistingProduct(sheetCols[1][i]) {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 商品编号必须为纯数字
|
||||||
|
if i < len(sheetCols[0]) {
|
||||||
|
if sheetCols[0][i] != "" {
|
||||||
|
if _, err := strconv.Atoi(sheetCols[0][i]); err != nil {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品编号必须为纯数字")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isExistingProductCode(sheetCols[0][i]) {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品编号不存在")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 所属门店不能为空
|
||||||
|
if i < len(sheetCols[4]) {
|
||||||
|
if sheetCols[4][i] == "" {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行所属门店不能为空")
|
||||||
|
}
|
||||||
|
if !isExistingStore(sheetCols[4][i]) {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行门店不存在")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数量必须为正整数
|
||||||
|
if i < len(sheetCols[3]) {
|
||||||
|
if quantity, err := strconv.Atoi(sheetCols[3][i]); err != nil || quantity < 1 {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行数量必须是大于等于1的整数")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 串码商品数量只能为1
|
||||||
|
var nCount int
|
||||||
|
if i < len(sheetCols[3]) {
|
||||||
|
if i < len(sheetCols[3]) {
|
||||||
|
nCount, _ = strconv.Atoi(sheetCols[3][i])
|
||||||
|
}
|
||||||
|
|
||||||
|
// 串码类商品数量只能为1
|
||||||
|
if sheetCols[2][i] != "" && nCount != 1 {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行串码类商品数量只能为1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断商品是否赠送
|
||||||
|
if i < len(sheetCols[6]) {
|
||||||
|
if sheetCols[6][i] != "是" && sheetCols[6][i] != "" {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品是否赠送填写有误")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询商品是否有库存
|
||||||
|
if sheetCols[2][i] != "" { // 串码商品
|
||||||
|
var imeiStockCommodity ErpStockCommodity
|
||||||
|
err := orm.Eloquent.Table("erp_stock_commodity").Where("imei = ? and state = ?",
|
||||||
|
sheetCols[2][i], InStock).
|
||||||
|
Find(&imeiStockCommodity).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if imeiStockCommodity.ID == 0 {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
// 门店对比
|
||||||
|
if imeiStockCommodity.StoreName != sheetCols[4][i] {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品" +
|
||||||
|
"[" + imeiStockCommodity.ErpCommodityName + "]非所选门店库存,请检查")
|
||||||
|
}
|
||||||
|
// 零售价对比
|
||||||
|
var floatVal float64
|
||||||
|
if i < len(sheetCols[5]) {
|
||||||
|
if sheetCols[5][i] != "" {
|
||||||
|
floatVal, err = strconv.ParseFloat(sheetCols[5][i], 64)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行零售价有误")
|
||||||
|
}
|
||||||
|
strMin := strconv.FormatFloat(imeiStockCommodity.MinRetailPrice, 'f', 2, 64)
|
||||||
|
if floatVal < imeiStockCommodity.MinRetailPrice {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行零售价有误,不能低于最低零售价[" + strMin + "]")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // 非串码商品
|
||||||
|
var count int64
|
||||||
|
var err error
|
||||||
|
if sheetCols[0][i] != "" { // 商品编号不为空
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("commodity_serial_number = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
sheetCols[0][i], sheetCols[4][i], InStock, NoIMEICommodity).
|
||||||
|
Count(&count).Error
|
||||||
|
} else {
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("erp_commodity_name = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
sheetCols[1][i], sheetCols[4][i], InStock, NoIMEICommodity).
|
||||||
|
Count(&count).Error
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
|
||||||
|
if count < int64(nCount) {
|
||||||
|
// 获取商品名称
|
||||||
|
return errors.New("第" + strconv.Itoa(i+1) + "行商品" + "[" + sheetCols[1][i] + "]库存不足")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将读取的excel数据转换成OrderExcel struct
|
||||||
|
func transOrderData(colsMap []map[string]interface{}) ([]OrderExcel, error) {
|
||||||
|
var stockInfos []OrderExcel
|
||||||
|
|
||||||
|
// 遍历 colsMap 进行类型断言和转换
|
||||||
|
for _, col := range colsMap {
|
||||||
|
var stockInfo OrderExcel
|
||||||
|
|
||||||
|
// 将 col 转换为 JSON 字符串
|
||||||
|
jsonData, err := json.Marshal(col)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to marshal data to JSON: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将 JSON 字符串反序列化为 CommodityExcel
|
||||||
|
if err := json.Unmarshal(jsonData, &stockInfo); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal JSON to StockExcel: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将处理后的数据追加到 commodities 中
|
||||||
|
stockInfos = append(stockInfos, stockInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
return stockInfos, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ImportOrderData(colsMap []map[string]interface{}) ([]ErpOrderCommodity, error) {
|
||||||
|
list, err := transOrderData(colsMap)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var orderCommodities []ErpOrderCommodity
|
||||||
|
for i, _ := range list {
|
||||||
|
var orderCommodity ErpOrderCommodity
|
||||||
|
|
||||||
|
// 商品数量
|
||||||
|
var nCount int
|
||||||
|
nCount, _ = strconv.Atoi(list[i].Count)
|
||||||
|
|
||||||
|
// 判断商品是否赠送
|
||||||
|
var nPresentType uint32
|
||||||
|
nPresentType = 1
|
||||||
|
if i < len(list[i].PresentType) {
|
||||||
|
if list[i].PresentType == "是" {
|
||||||
|
nPresentType = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询商品是否有库存
|
||||||
|
if list[i].IMEI != "" { // 串码商品
|
||||||
|
var imeiStockCommodity ErpStockCommodity
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").Where("imei = ? and state = ?",
|
||||||
|
list[i].IMEI, InStock).
|
||||||
|
Find(&imeiStockCommodity).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if imeiStockCommodity.ID == 0 {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
// 门店对比
|
||||||
|
if imeiStockCommodity.StoreName != list[i].StoreName {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品" +
|
||||||
|
"[" + imeiStockCommodity.ErpCommodityName + "]非所选门店库存,请检查")
|
||||||
|
}
|
||||||
|
// 零售价对比
|
||||||
|
var floatVal float64
|
||||||
|
if list[i].SalePrice != "" {
|
||||||
|
floatVal, err = strconv.ParseFloat(list[i].SalePrice, 64)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行零售价有误")
|
||||||
|
}
|
||||||
|
strMin := strconv.FormatFloat(imeiStockCommodity.MinRetailPrice, 'f', 2, 64)
|
||||||
|
if floatVal < imeiStockCommodity.MinRetailPrice {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行零售价有误,不能低于最低零售价[" + strMin + "]")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
floatVal = imeiStockCommodity.RetailPrice
|
||||||
|
}
|
||||||
|
|
||||||
|
orderCommodity.ErpCategoryId = imeiStockCommodity.ErpCategoryId
|
||||||
|
orderCommodity.ErpCategoryName = imeiStockCommodity.ErpCategoryName
|
||||||
|
orderCommodity.ErpCommodityId = imeiStockCommodity.ErpCommodityId
|
||||||
|
orderCommodity.ErpCommodityName = imeiStockCommodity.ErpCommodityName
|
||||||
|
orderCommodity.ErpSupplierId = imeiStockCommodity.ErpSupplierId
|
||||||
|
orderCommodity.ErpSupplierName = imeiStockCommodity.ErpSupplierName
|
||||||
|
orderCommodity.IMEIType = imeiStockCommodity.IMEIType
|
||||||
|
orderCommodity.IMEI = imeiStockCommodity.IMEI
|
||||||
|
orderCommodity.PresentType = nPresentType
|
||||||
|
orderCommodity.RetailPrice = imeiStockCommodity.RetailPrice
|
||||||
|
orderCommodity.SalePrice = floatVal
|
||||||
|
orderCommodity.ReceivedAmount = floatVal
|
||||||
|
orderCommodity.SaleDiscount = floatVal - imeiStockCommodity.RetailPrice
|
||||||
|
orderCommodity.WholesalePrice = imeiStockCommodity.WholesalePrice
|
||||||
|
orderCommodity.StaffCostPrice = imeiStockCommodity.StaffCostPrice
|
||||||
|
orderCommodity.MemberDiscount = imeiStockCommodity.MemberDiscount
|
||||||
|
orderCommodity.SalesProfit = floatVal - imeiStockCommodity.WholesalePrice
|
||||||
|
orderCommodity.StaffProfit = floatVal - imeiStockCommodity.StaffCostPrice
|
||||||
|
orderCommodity.Count = int32(nCount)
|
||||||
|
orderCommodity.Remark = list[i].Remark
|
||||||
|
|
||||||
|
} else { // 非串码商品
|
||||||
|
var count int64
|
||||||
|
var imeiStockCommodities []ErpStockCommodity
|
||||||
|
if list[i].SerialNum != "" { // 商品编号不为空
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("commodity_serial_number = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
list[i].SerialNum, list[i].StoreName, InStock, NoIMEICommodity).
|
||||||
|
Count(&count).Error
|
||||||
|
} else {
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("erp_commodity_name = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
list[i].Name, list[i].StoreName, InStock, NoIMEICommodity).
|
||||||
|
Count(&count).Error
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
|
||||||
|
if count < int64(nCount) {
|
||||||
|
// 获取商品名称
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品" + "[" + list[i].Name + "]库存不足")
|
||||||
|
}
|
||||||
|
|
||||||
|
if list[i].SerialNum != "" { // 商品编号不为空
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("commodity_serial_number = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
list[i].SerialNum, list[i].StoreName, InStock, NoIMEICommodity).
|
||||||
|
Find(&imeiStockCommodities).Order("first_stock_time DESC").Error
|
||||||
|
} else {
|
||||||
|
err = orm.Eloquent.Table("erp_stock_commodity").
|
||||||
|
Where("erp_commodity_name = ? and store_name = ? and state = ? and imei_type = ?",
|
||||||
|
list[i].Name, list[i].StoreName, InStock, NoIMEICommodity).
|
||||||
|
Find(&imeiStockCommodities).Order("first_stock_time DESC").Error
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(imeiStockCommodities) == 0 {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行商品不存在")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 零售价对比
|
||||||
|
var floatVal float64
|
||||||
|
if list[i].SalePrice != "" {
|
||||||
|
floatVal, err = strconv.ParseFloat(list[i].SalePrice, 64)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行零售价有误")
|
||||||
|
}
|
||||||
|
strMin := strconv.FormatFloat(imeiStockCommodities[0].MinRetailPrice, 'f', 2, 64)
|
||||||
|
if floatVal < imeiStockCommodities[0].MinRetailPrice {
|
||||||
|
return nil, errors.New("第" + strconv.Itoa(i+1) + "行零售价有误,不能低于最低零售价[" + strMin + "]")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
floatVal = imeiStockCommodities[0].RetailPrice
|
||||||
|
}
|
||||||
|
|
||||||
|
orderCommodity.ErpCategoryId = imeiStockCommodities[0].ErpCategoryId
|
||||||
|
orderCommodity.ErpCategoryName = imeiStockCommodities[0].ErpCategoryName
|
||||||
|
orderCommodity.ErpCommodityId = imeiStockCommodities[0].ErpCommodityId
|
||||||
|
orderCommodity.ErpCommodityName = imeiStockCommodities[0].ErpCommodityName
|
||||||
|
orderCommodity.ErpSupplierId = imeiStockCommodities[0].ErpSupplierId
|
||||||
|
orderCommodity.ErpSupplierName = imeiStockCommodities[0].ErpSupplierName
|
||||||
|
orderCommodity.IMEIType = imeiStockCommodities[0].IMEIType
|
||||||
|
orderCommodity.IMEI = imeiStockCommodities[0].IMEI
|
||||||
|
orderCommodity.PresentType = nPresentType
|
||||||
|
orderCommodity.RetailPrice = imeiStockCommodities[0].RetailPrice
|
||||||
|
orderCommodity.SalePrice = floatVal
|
||||||
|
orderCommodity.ReceivedAmount = floatVal
|
||||||
|
orderCommodity.SaleDiscount = floatVal - imeiStockCommodities[0].RetailPrice
|
||||||
|
orderCommodity.WholesalePrice = imeiStockCommodities[0].WholesalePrice
|
||||||
|
orderCommodity.StaffCostPrice = imeiStockCommodities[0].StaffCostPrice
|
||||||
|
orderCommodity.MemberDiscount = imeiStockCommodities[0].MemberDiscount
|
||||||
|
orderCommodity.SalesProfit = floatVal - imeiStockCommodities[0].WholesalePrice
|
||||||
|
orderCommodity.StaffProfit = floatVal - imeiStockCommodities[0].StaffCostPrice
|
||||||
|
orderCommodity.Count = int32(nCount)
|
||||||
|
orderCommodity.Remark = list[i].Remark
|
||||||
|
}
|
||||||
|
|
||||||
|
orderCommodities = append(orderCommodities, orderCommodity)
|
||||||
|
}
|
||||||
|
|
||||||
|
return orderCommodities, nil
|
||||||
|
}
|
||||||
|
|
|
@ -25,4 +25,5 @@ func registerErpOrderManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJW
|
||||||
r.POST("show_all_data", erpordermanage.ErpOrderShowAllData) // 展示所有订单
|
r.POST("show_all_data", erpordermanage.ErpOrderShowAllData) // 展示所有订单
|
||||||
r.POST("daily_report", erpordermanage.ErpOrderDailyReport) // 经营日报表
|
r.POST("daily_report", erpordermanage.ErpOrderDailyReport) // 经营日报表
|
||||||
r.POST("sale_detail", erpordermanage.ErpOrderSaleDetail) // 查询销售明细
|
r.POST("sale_detail", erpordermanage.ErpOrderSaleDetail) // 查询销售明细
|
||||||
|
r.POST("import", erpordermanage.ErpOrderBatchImport) // 批量导入零售数据
|
||||||
}
|
}
|
||||||
|
|
45
docs/docs.go
45
docs/docs.go
|
@ -1943,6 +1943,39 @@ const docTemplate = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/v1/erp_order/import": {
|
||||||
|
"post": {
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"零售订单"
|
||||||
|
],
|
||||||
|
"summary": "批量导入零售数据",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "上传excel文件",
|
||||||
|
"name": "file",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.ErpOrderBatchImportResp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/v1/erp_order/list": {
|
"/api/v1/erp_order/list": {
|
||||||
"post": {
|
"post": {
|
||||||
"consumes": [
|
"consumes": [
|
||||||
|
@ -9455,6 +9488,18 @@ const docTemplate = `{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.ErpOrderBatchImportResp": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"commodities": {
|
||||||
|
"description": "零售订单商品信息",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/models.ErpOrderCommodity"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.ErpOrderCashier": {
|
"models.ErpOrderCashier": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
|
@ -1932,6 +1932,39 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/v1/erp_order/import": {
|
||||||
|
"post": {
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"零售订单"
|
||||||
|
],
|
||||||
|
"summary": "批量导入零售数据",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"description": "上传excel文件",
|
||||||
|
"name": "file",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/models.ErpOrderBatchImportResp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/v1/erp_order/list": {
|
"/api/v1/erp_order/list": {
|
||||||
"post": {
|
"post": {
|
||||||
"consumes": [
|
"consumes": [
|
||||||
|
@ -9444,6 +9477,18 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"models.ErpOrderBatchImportResp": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"commodities": {
|
||||||
|
"description": "零售订单商品信息",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/models.ErpOrderCommodity"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"models.ErpOrderCashier": {
|
"models.ErpOrderCashier": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
|
@ -2268,6 +2268,14 @@ definitions:
|
||||||
- bill_sn
|
- bill_sn
|
||||||
- state
|
- state
|
||||||
type: object
|
type: object
|
||||||
|
models.ErpOrderBatchImportResp:
|
||||||
|
properties:
|
||||||
|
commodities:
|
||||||
|
description: 零售订单商品信息
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/models.ErpOrderCommodity'
|
||||||
|
type: array
|
||||||
|
type: object
|
||||||
models.ErpOrderCashier:
|
models.ErpOrderCashier:
|
||||||
properties:
|
properties:
|
||||||
amount:
|
amount:
|
||||||
|
@ -9779,6 +9787,27 @@ paths:
|
||||||
summary: 编辑零售订单
|
summary: 编辑零售订单
|
||||||
tags:
|
tags:
|
||||||
- 零售订单
|
- 零售订单
|
||||||
|
/api/v1/erp_order/import:
|
||||||
|
post:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
parameters:
|
||||||
|
- description: 上传excel文件
|
||||||
|
in: body
|
||||||
|
name: file
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/models.ErpOrderBatchImportResp'
|
||||||
|
summary: 批量导入零售数据
|
||||||
|
tags:
|
||||||
|
- 零售订单
|
||||||
/api/v1/erp_order/list:
|
/api/v1/erp_order/list:
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user