优化生产反馈缺陷:

1.小程序调用erp登录接口不判断验证码;
2.修改原接口的翻页相关字段;
3.修复float64转int32精度丢失的缺陷;
4.注释库存导入时采购价需大于0的校验;
5.相关域名改成生产环境域名;
This commit is contained in:
chenlin 2024-07-03 18:56:33 +08:00
parent 59766f70b3
commit 0a5fe58bbe
16 changed files with 261 additions and 84 deletions

View File

@ -26,3 +26,7 @@ dev:
beta: beta:
GOOS=linux GOARCH=amd64 go build -o test_mh_goadmin_server main.go GOOS=linux GOARCH=amd64 go build -o test_mh_goadmin_server main.go
pro:
GOOS=linux GOARCH=amd64 go build -o mh_goadmin_server main.go

View File

@ -453,7 +453,7 @@ func DeliverTaskList(c *gin.Context) {
return return
} }
ret := map[string]interface{}{ ret := map[string]interface{}{
"count": totalCount, "total": totalCount,
"list": list, "list": list,
"page_index": req.PageIdx, "page_index": req.PageIdx,
"page_size": req.PageSize, "page_size": req.PageSize,

View File

@ -46,7 +46,7 @@ func GoodsOrderList(c *gin.Context) {
return return
} }
ret := map[string]interface{}{ ret := map[string]interface{}{
"count": totalCount, "total": totalCount,
"list": orderList, "list": orderList,
"page_index": req.PageIdx, "page_index": req.PageIdx,
"page_size": req.PageSize, "page_size": req.PageSize,

View File

@ -265,10 +265,10 @@ func FundRecordList(c *gin.Context) {
} }
ret := map[string]interface{}{ ret := map[string]interface{}{
"count": count, "total": count,
"list": list, "list": list,
"pageIndex": req.Page, "pageIndex": req.Page,
"total_page": req.PageSize, "pageSize": req.PageSize,
} }
app.OK(c, ret, "") app.OK(c, ret, "")
} }

View File

@ -20,6 +20,7 @@ import (
"github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
"github.com/wechatpay-apiv3/wechatpay-go/services/transferbatch" "github.com/wechatpay-apiv3/wechatpay-go/services/transferbatch"
"go-admin/tools/config"
"io" "io"
"os" "os"
@ -77,14 +78,17 @@ const (
WxAppMchId = "1609877389" WxAppMchId = "1609877389"
WxAppMchSecret = "DeovoMingHuiRengTianTang45675456" WxAppMchSecret = "DeovoMingHuiRengTianTang45675456"
UnifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder" UnifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"
HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api" HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api"
PemBegin = "-----BEGIN RSA PRIVATE KEY-----\n" PemBegin = "-----BEGIN RSA PRIVATE KEY-----\n"
PemEnd = "\n-----END RSA PRIVATE KEY-----" PemEnd = "\n-----END RSA PRIVATE KEY-----"
HmPubKey = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzGVH0Fxpb2M48U1BWr6lpNs2W3VHqtjO8X5RqWjtTwpQVKo8dqaiAGxVbsdnefPpsbI5l9rKquRAOJhWFU07hxSUgXZOk55QQmll03MBgRDXLgxyKfycLLQwhsCJAzDIWC7IWgok/RHV9m9AV2GbQxWBl+7iDE4prcbpgG8Z0HwIDAQAB` HmPubKey = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzGVH0Fxpb2M48U1BWr6lpNs2W3VHqtjO8X5RqWjtTwpQVKo8dqaiAGxVbsdnefPpsbI5l9rKquRAOJhWFU07hxSUgXZOk55QQmll03MBgRDXLgxyKfycLLQwhsCJAzDIWC7IWgok/RHV9m9AV2GbQxWBl+7iDE4prcbpgG8Z0HwIDAQAB`
HmPayMerchantId = "664403000030115" HmPayMerchantId = "664403000030115"
TimeFormat = "2006-01-02 15:04:05" TimeFormat = "2006-01-02 15:04:05"
clientIp = "112.33.14.191" clientIp = "39.108.188.218" // 小程序服务器
clientIpDev = "112.33.14.191" // 移动云服务器
HmPayMerchantIdDeovo = "664403000021193"
HmPubKeyDeovo = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDA4g8VFWIxEbOzxYC8ZIOgaOsLWK4Y5k9D8GwJ1Gige79LbTxbe3PH12KMc59DpCR1PnIDwlYWjIE7mZZAHgImXs0pSFihvlNS9srWk2uPlEXXQjjIZ3mnPoXtNhU0x5cYdkB8jtijcYMSGwKmdrIvpvPX3MrDKOX6dJ1T4ll+QIDAQAB"
) )
const ( const (
@ -693,6 +697,81 @@ type HmPayUnifiedOrderRsp struct {
Sign string `json:"sign"` Sign string `json:"sign"`
} }
func ParsePrivateKeyDeovo() (*rsa.PrivateKey, error) {
//fp := "/Users/max/Documents/code/deovo/mh_goadmin_server/config/hm_pay/private_key.pem"
fp := "./config/hm_pay/deovo_private_key.pem"
privateKey, err := os.ReadFile(fp)
if err != nil {
logger.Errorf("read file err:", err)
return nil, err
}
block, _ := pem.Decode([]byte(privateKey))
if block == nil {
return nil, errors.New("私钥信息错误!")
}
//priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
priKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
if priKey == nil {
return nil, errors.New("pri key is nil")
}
return priKey.(*rsa.PrivateKey), nil
}
func Sha1withRsaDeovo(signContent string) (string, error) {
hash := crypto.SHA1
shaNew := hash.New()
shaNew.Write([]byte(signContent))
hashed := shaNew.Sum(nil)
priKey, err := ParsePrivateKeyDeovo()
if err != nil {
logger.Errorf("parse err:", err)
return "", err
}
signature, err := rsa.SignPKCS1v15(rand.Reader, priKey, hash, hashed)
if err != nil {
logger.Errorf("sign err:", err)
return "", err
}
return b64.StdEncoding.EncodeToString(signature), nil
}
func GenHmPaySignDeovo(m map[string]string) (string, error) {
delete(m, "sign")
var signData []string
for k, v := range m {
if k == "openid" {
fmt.Println(k, ":", v)
}
if v != "" && v != "0" {
signData = append(signData, fmt.Sprintf("%s=%s", k, v))
}
}
//signDataJson, _ := json.MarshalIndent(&signData, "", " ")
//fmt.Println("signDataJson1", string(signDataJson))
sort.Strings(signData)
//signDataJson2, _ := json.MarshalIndent(&signData, "", " ")
//fmt.Println("signDataJson2", string(signDataJson2))
signStr := strings.Join(signData, "&")
//signStr = signStr + "&key=" + payKey
//logger.Info("签字符串1:", logger.Field("signStr", signStr))
fmt.Println("签字符串1:", signStr)
signature, err := Sha1withRsaDeovo(signStr)
if err != nil {
logger.Errorf("signature err:", err)
return "", err
}
return signature, nil
}
func ParsePrivateKey() (*rsa.PrivateKey, error) { func ParsePrivateKey() (*rsa.PrivateKey, error) {
//fp := "/Users/max/Documents/code/deovo/mh_goadmin_server/config/hm_pay/private_key.pem" //fp := "/Users/max/Documents/code/deovo/mh_goadmin_server/config/hm_pay/private_key.pem"
fp := "./config/hm_pay/private_key.pem" fp := "./config/hm_pay/private_key.pem"
@ -825,6 +904,50 @@ func HmPayUnifiedOrder(r HmJsPayUnifiedOrderReq) (HmPayUnifiedOrderRsp, error) {
return hmPayUnifiedOrderRsp, nil return hmPayUnifiedOrderRsp, nil
} }
func HmVerifySha1RsaDeovo(signContent, signBase string) error {
//fp := "/Users/li/mh/mh_server/pack/configs/hm_pay/public_key.pme"
//publicKeyString, err := ioutil.ReadFile(fp)
//if err != nil {
// fmt.Println("read file err:", err)
// return err
//}
block, _ := pem.Decode([]byte(FormatPrivateKey(HmPubKeyDeovo)))
if block == nil {
fmt.Println("decode block is nil")
return errors.New("decode block is nil")
}
publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
fmt.Println("public key err:", err)
return err
}
if publicKey == nil {
fmt.Println("public key nil:")
return err
}
hash := crypto.SHA1
shaNew := hash.New()
shaNew.Write([]byte(signContent))
hashed := shaNew.Sum(nil)
sign, err := b64.StdEncoding.DecodeString(signBase)
if err != nil {
fmt.Println("sign decode err:", err)
return err
}
err = rsa.VerifyPKCS1v15(publicKey.(*rsa.PublicKey), hash, hashed, sign)
if err != nil {
fmt.Println("verify err:", err)
return err
}
//logger.Error("验签成功")
fmt.Println("验签成功")
return nil
}
func HmVerifySha1Rsa(signContent, signBase string) error { func HmVerifySha1Rsa(signContent, signBase string) error {
//fp := "/Users/li/mh/mh_server/pack/configs/hm_pay/public_key.pme" //fp := "/Users/li/mh/mh_server/pack/configs/hm_pay/public_key.pme"
//publicKeyString, err := ioutil.ReadFile(fp) //publicKeyString, err := ioutil.ReadFile(fp)
@ -911,7 +1034,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri
unifiedOrderReq := HmJsPayUnifiedOrderReq{} unifiedOrderReq := HmJsPayUnifiedOrderReq{}
publicPara := HmPayPublicPara{ publicPara := HmPayPublicPara{
AppId: HmPayMerchantId, AppId: HmPayMerchantIdDeovo,
//SubAppId: HmWxSubMerchantId, //SubAppId: HmWxSubMerchantId,
Method: "trade.pay", Method: "trade.pay",
//Charset: "UTF-8", //Charset: "UTF-8",
@ -935,6 +1058,10 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri
StoreId: "100001", StoreId: "100001",
NotifyUrl: notifyUrl, NotifyUrl: notifyUrl,
} }
if config.ApplicationConfig.Mode == "dev" {
biz.CreateIp = clientIpDev
}
unifiedOrderReq.HmPayPublicPara = publicPara unifiedOrderReq.HmPayPublicPara = publicPara
bizString, err := json.Marshal(&biz) bizString, err := json.Marshal(&biz)
@ -949,7 +1076,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri
return nil, err return nil, err
} }
sign, err := GenHmPaySign(m) sign, err := GenHmPaySignDeovo(m)
if err != nil { if err != nil {
logger.Error("HmJsPayUnifiedOrder GenHmPaySign err:", logger.Field("err", err)) logger.Error("HmJsPayUnifiedOrder GenHmPaySign err:", logger.Field("err", err))
return nil, err return nil, err
@ -967,7 +1094,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri
logger.Errorf("ToSignContent err:", err) logger.Errorf("ToSignContent err:", err)
return nil, err return nil, err
} }
err = HmVerifySha1Rsa(signContent, unifiedOrderResp.Sign) err = HmVerifySha1RsaDeovo(signContent, unifiedOrderResp.Sign)
if err != nil { if err != nil {
logger.Errorf("HmVerifySha1Rsa err:", err) logger.Errorf("HmVerifySha1Rsa err:", err)
return nil, err return nil, err

View File

@ -241,6 +241,12 @@ func InsertSysUser(c *gin.Context) {
begin := orm.Eloquent.Begin() begin := orm.Eloquent.Begin()
sysUser.CreateBy = tools.GetUserIdStr(c) sysUser.CreateBy = tools.GetUserIdStr(c)
id, err := sysUser.Insert(begin) id, err := sysUser.Insert(begin)
if err != nil {
begin.Rollback()
logger.Error("Insert err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "添加失败")
return
}
// 如果添加了小程序id则需要更新user表的user_type字段为2-店员 // 如果添加了小程序id则需要更新user表的user_type字段为2-店员
if req.Uid != 0 { if req.Uid != 0 {

View File

@ -72,7 +72,7 @@ func Authenticator(c *gin.Context) (interface{}, error) {
return nil, jwt.ErrMissingLoginValues return nil, jwt.ErrMissingLoginValues
} }
if config.ApplicationConfig.Mode != "dev" { if config.ApplicationConfig.Mode != "dev" && loginVals.Username != "erp" {
if !store.Verify(loginVals.UUID, loginVals.Code, true) { if !store.Verify(loginVals.UUID, loginVals.Code, true) {
username = loginVals.Username username = loginVals.Username
msg = "验证码错误" msg = "验证码错误"

View File

@ -817,6 +817,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
if !endTime.IsZero() { if !endTime.IsZero() {
qs = qs.Where("created_at<?", endTime) qs = qs.Where("created_at<?", endTime)
} }
err = qs.Count(&count).Error
if err != nil {
logger.Error("count err:", err)
return nil, err
}
if m.IsExport == 1 { if m.IsExport == 1 {
err = qs.Order("id DESC").Find(&memberDayStorePromotions).Error err = qs.Order("id DESC").Find(&memberDayStorePromotions).Error
} else { } else {
@ -839,6 +846,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
if !endTime.IsZero() { if !endTime.IsZero() {
qs = qs.Where("created_at<?", endTime) qs = qs.Where("created_at<?", endTime)
} }
err = qs.Count(&count).Error
if err != nil {
logger.Error("count err:", err)
return nil, err
}
if m.IsExport == 1 { if m.IsExport == 1 {
err = qs.Order("id DESC").Find(&memberDayPromotions).Error err = qs.Order("id DESC").Find(&memberDayPromotions).Error
} else { } else {
@ -869,6 +883,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
if !endTime.IsZero() { if !endTime.IsZero() {
qs = qs.Where("created_at<?", endTime) qs = qs.Where("created_at<?", endTime)
} }
err = qs.Count(&count).Error
if err != nil {
logger.Error("count err:", err)
return nil, err
}
if m.IsExport == 1 { if m.IsExport == 1 {
err = qs.Order("id DESC").Find(&memberStorePromotions).Error err = qs.Order("id DESC").Find(&memberStorePromotions).Error
} else { } else {
@ -878,13 +899,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
} else { } else {
var memberPromotions []CooperativeMemberPromotion var memberPromotions []CooperativeMemberPromotion
qs = orm.Eloquent.Table("cooperative_member_promotion").Where("cooperative_business_id=?", m.CooperativeBusinessId) qs = orm.Eloquent.Table("cooperative_member_promotion").Where("cooperative_business_id=?", m.CooperativeBusinessId)
if len(validStoreList) > 0 { //if len(validStoreList) > 0 {
if len(validStoreList) == 1 { // if len(validStoreList) == 1 {
qs = qs.Where("store_id = ?", validStoreList[0]) // qs = qs.Where("store_id = ?", validStoreList[0])
} else { // } else {
qs = qs.Where("store_id IN (?)", validStoreList) // qs = qs.Where("store_id IN (?)", validStoreList)
} // }
} //}
//if m.Date != "" { //if m.Date != "" {
// qs = qs.Where("date=?", m.Date) // qs = qs.Where("date=?", m.Date)
//} //}
@ -894,6 +915,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
if !endTime.IsZero() { if !endTime.IsZero() {
qs = qs.Where("created_at<?", endTime) qs = qs.Where("created_at<?", endTime)
} }
err = qs.Count(&count).Error
if err != nil {
logger.Error("count err:", err)
return nil, err
}
if m.IsExport == 1 { if m.IsExport == 1 {
err = qs.Order("id DESC").Find(&memberPromotions).Error err = qs.Order("id DESC").Find(&memberPromotions).Error
} else { } else {
@ -914,11 +942,11 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat
return nil, err return nil, err
} }
err = qs.Count(&count).Error //err = qs.Count(&count).Error
if err != nil { //if err != nil {
logger.Error("count err:", err) // logger.Error("count err:", err)
return nil, err // return nil, err
} //}
if m.IsExport == 1 { if m.IsExport == 1 {
fileName, err := promotionStatisticListExport(list) fileName, err := promotionStatisticListExport(list)

View File

@ -408,10 +408,10 @@ type ErpOrderReceiptDataResp struct {
} }
type TableData struct { type TableData struct {
Name string `json:"name"` Name string `json:"name"`
SL uint32 `json:"SL"` // 销售数量 SL uint32 `json:"SL"` // 销售数量
DJ uint32 `json:"DJ"` // 商品指导零售价 DJ float64 `json:"DJ"` // 商品指导零售价
JE uint32 `json:"JE"` // 商品指导零售价乘以销售数量 JE float64 `json:"JE"` // 商品指导零售价乘以销售数量
} }
// Contains 判断id是否在list中 // Contains 判断id是否在list中
@ -1949,12 +1949,12 @@ func ErpOrderPay(req *ErpOrderPayReq, c *gin.Context) (*ErpOrderPayResp, error)
return resp, err return resp, err
} }
// 更新库存订单表 //// 更新库存订单表
err = updateErpStockCommodity(begin, req.BillSn) //err = updateErpStockCommodity(begin, req.BillSn)
if err != nil { //if err != nil {
logger.Error("ErpOrderPay updateErpStockCommodity err:", logger.Field("err", err)) // logger.Error("ErpOrderPay updateErpStockCommodity err:", logger.Field("err", err))
return resp, err // return resp, err
} //}
} }
err = begin.Commit().Error err = begin.Commit().Error
@ -2040,12 +2040,12 @@ func QueryErpOrderPayStatus(billSn string) (*ErpOrderPayResp, error) {
return resp, err return resp, err
} }
// 更新库存订单表 //// 更新库存订单表
err = updateErpStockCommodity(begin, billSn) //err = updateErpStockCommodity(begin, billSn)
if err != nil { //if err != nil {
logger.Error("ErpOrderPay updateErpStockCommodity err:", logger.Field("err", err)) // logger.Error("ErpOrderPay updateErpStockCommodity err:", logger.Field("err", err))
return resp, err // return resp, err
} //}
} }
err = begin.Commit().Error err = begin.Commit().Error
@ -2573,13 +2573,13 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
salesAmount = -item.RejectedAmount // 退货订单要以实际退货金额为准 salesAmount = -item.RejectedAmount // 退货订单要以实际退货金额为准
salesCost = -item.WholesalePrice * float64(item.Count) salesCost = -item.WholesalePrice * float64(item.Count)
employeeCost = -(item.WholesalePrice + item.StaffCostPrice) * float64(item.Count) employeeCost = -(item.WholesalePrice + item.StaffCostPrice) * float64(item.Count)
salesMargin = -(item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) salesMargin = -(item.ReceivedAmount - item.WholesalePrice*float64(item.Count))
} else { } else {
nCount = int32(item.Count) nCount = int32(item.Count)
salesAmount = item.ReceivedAmount salesAmount = item.ReceivedAmount
salesCost = item.WholesalePrice * float64(item.Count) salesCost = item.WholesalePrice * float64(item.Count)
employeeCost = (item.WholesalePrice + item.StaffCostPrice) * float64(item.Count) employeeCost = (item.WholesalePrice + item.StaffCostPrice) * float64(item.Count)
salesMargin = item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count) salesMargin = item.ReceivedAmount - item.WholesalePrice*float64(item.Count)
} }
// 检查是否已经处理过这个组合的数据 // 检查是否已经处理过这个组合的数据
if existingData, ok := processedData[key]; ok { if existingData, ok := processedData[key]; ok {
@ -2609,12 +2609,12 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
SalesAmount: item.ReceivedAmount, SalesAmount: item.ReceivedAmount,
SalesCost: item.WholesalePrice * float64(item.Count), SalesCost: item.WholesalePrice * float64(item.Count),
EmployeeCost: (item.WholesalePrice + item.StaffCostPrice) * float64(item.Count), EmployeeCost: (item.WholesalePrice + item.StaffCostPrice) * float64(item.Count),
SalesMargin: item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count), SalesMargin: item.ReceivedAmount - item.WholesalePrice*float64(item.Count),
GrossMargins: "--", GrossMargins: "--",
//GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Total)) / item.ReceivedAmount), //GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Total)) / item.ReceivedAmount),
} }
if item.ReceivedAmount != 0 { if item.ReceivedAmount != 0 {
data.GrossMargins = float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount) data.GrossMargins = float64ToPercentage((item.ReceivedAmount - item.WholesalePrice*float64(item.Count)) / item.ReceivedAmount)
} }
// 如果是拒绝的销售,进行相应的处理 // 如果是拒绝的销售,进行相应的处理
@ -4260,8 +4260,8 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD
var tableData TableData var tableData TableData
tableData.Name = item.ErpCommodityName tableData.Name = item.ErpCommodityName
tableData.SL = uint32(item.Count) tableData.SL = uint32(item.Count)
tableData.DJ = uint32(item.RetailPrice) tableData.DJ = item.RetailPrice
tableData.JE = uint32(item.Count) * uint32(item.RetailPrice) tableData.JE = float64(item.Count) * item.RetailPrice
key := fmt.Sprintf("commodity_%d", i) key := fmt.Sprintf("commodity_%d", i)
commodityMap[key] = tableData commodityMap[key] = tableData
@ -4689,11 +4689,11 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
// 销售毛利:实际退货金额-采购金额(需要先取负值,然后再计算),结果等同于:采购金额-实际退货金额 // 销售毛利:实际退货金额-采购金额(需要先取负值,然后再计算),结果等同于:采购金额-实际退货金额
//salesProfit := (-v.RejectedAmount) - (-float64(int32(v.WholesalePrice) * v.Count)) //salesProfit := (-v.RejectedAmount) - (-float64(int32(v.WholesalePrice) * v.Count))
salesProfit := req.ErpOrderCommodities[i].RejectedAmount - float64(int32(req.ErpOrderCommodities[i].WholesalePrice)*req.ErpOrderCommodities[i].Count) salesProfit := req.ErpOrderCommodities[i].RejectedAmount - req.ErpOrderCommodities[i].WholesalePrice*float64(req.ErpOrderCommodities[i].Count)
// 员工毛利 // todo 待测试核实 // 员工毛利 // todo 待测试核实
//StaffProfit := salesProfit - (-float64(int32(v.StaffCostPrice) * v.Count)) //StaffProfit := salesProfit - (-float64(int32(v.StaffCostPrice) * v.Count))
StaffProfit := salesProfit - float64(int32(req.ErpOrderCommodities[i].StaffCostPrice)*req.ErpOrderCommodities[i].Count) StaffProfit := salesProfit - req.ErpOrderCommodities[i].StaffCostPrice*float64(req.ErpOrderCommodities[i].Count)
req.ErpOrderCommodities[i].SalesProfit = salesProfit // 销售毛利 req.ErpOrderCommodities[i].SalesProfit = salesProfit // 销售毛利
req.ErpOrderCommodities[i].StaffProfit = StaffProfit // 员工毛利 req.ErpOrderCommodities[i].StaffProfit = StaffProfit // 员工毛利
@ -4762,9 +4762,9 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
// 销售毛利 备注:产品说有亏本销售的情况,不用判断毛利是否<0 // 销售毛利 备注:产品说有亏本销售的情况,不用判断毛利是否<0
salesProfit := req.ErpOrderCommodities[i].ReceivedAmount - salesProfit := req.ErpOrderCommodities[i].ReceivedAmount -
float64(int32(req.ErpOrderCommodities[i].WholesalePrice)*req.ErpOrderCommodities[i].Count) req.ErpOrderCommodities[i].WholesalePrice*float64(req.ErpOrderCommodities[i].Count)
// 员工毛利 // 员工毛利
StaffProfit := salesProfit - float64(int32(req.ErpOrderCommodities[i].StaffCostPrice)*req.ErpOrderCommodities[i].Count) StaffProfit := salesProfit - req.ErpOrderCommodities[i].StaffCostPrice*float64(req.ErpOrderCommodities[i].Count)
// 单个商品的销售毛利 // 单个商品的销售毛利
req.ErpOrderCommodities[i].SalesProfit = salesProfit / float64(req.ErpOrderCommodities[i].Count) req.ErpOrderCommodities[i].SalesProfit = salesProfit / float64(req.ErpOrderCommodities[i].Count)
// 单个商品的员工毛利 // 单个商品的员工毛利

View File

@ -524,12 +524,12 @@ func checkStockExcel(sheetCols [][]string) error {
} }
} }
// 采购价、员工成本价必须大于0 //// 采购价、员工成本价必须大于0
if i < len(sheetCols[4]) { //if i < len(sheetCols[4]) {
if purchasePrice, err := strconv.ParseFloat(sheetCols[4][i], 64); err != nil || purchasePrice <= 0 { // if purchasePrice, err := strconv.ParseFloat(sheetCols[4][i], 64); err != nil || purchasePrice <= 0 {
return errors.New("第" + strconv.Itoa(i+1) + "行采购价必须是大于0的数字") // return errors.New("第" + strconv.Itoa(i+1) + "行采购价必须是大于0的数字")
} // }
} //}
if i < len(sheetCols[5]) { if i < len(sheetCols[5]) {
if employeeCost, err := strconv.ParseFloat(sheetCols[5][i], 64); err != nil || employeeCost <= 0 { if employeeCost, err := strconv.ParseFloat(sheetCols[5][i], 64); err != nil || employeeCost <= 0 {

View File

@ -1344,8 +1344,8 @@ func WxPayTransactionOrderClose(outTradeNo string) error {
// 密钥APIv3: DeovoMingHuiRengTianTang45675123 // 密钥APIv3: DeovoMingHuiRengTianTang45675123
// 证书序列号7540301D8FD52CCF7D6267DCF7CD2BC0AB467EFF // 证书序列号7540301D8FD52CCF7D6267DCF7CD2BC0AB467EFF
// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
privatePath := "/www/wwwroot/dev.admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 测试 //privatePath := "/www/wwwroot/dev.admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 测试
//privatePath := "/www/wwwroot/admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 正式 privatePath := "/www/wwwroot/admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 正式
mchPrivateKey, err := wechatpayutils.LoadPrivateKeyWithPath(privatePath) mchPrivateKey, err := wechatpayutils.LoadPrivateKeyWithPath(privatePath)
if err != nil { if err != nil {
//log.Fatal("load merchant private key error") //log.Fatal("load merchant private key error")

View File

@ -132,7 +132,7 @@ const QueryTimeFormat = "2006-01-02T15:04:05+08:00"
const StoreDateTimeFormat = "2006.01.02" const StoreDateTimeFormat = "2006.01.02"
const ( const (
ExportUrl = "https://dev.admin.deovo.com/load/export/" ExportUrl = "https://admin.deovo.com/load/export/"
) )
type UserInvite struct { type UserInvite struct {
@ -2615,9 +2615,10 @@ type UserDepositRefundRecordListReq struct {
Status uint32 `json:"status"` Status uint32 `json:"status"`
} }
type UserDepositRefundRecordListResp struct { type UserDepositRefundRecordListResp struct {
List []DepositRefundRecord `json:"list"` List []DepositRefundRecord `json:"list"`
Count uint32 `json:"count"` Total int `json:"total"` // 总条数
PageNum int `json:"pageIndex"` PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页展示条数
} }
func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDepositRefundRecordListResp, error) { func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDepositRefundRecordListResp, error) {
@ -2628,6 +2629,11 @@ func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDeposit
if m.Uid != 0 { if m.Uid != 0 {
qs = qs.Where("uid=?", m.Uid) qs = qs.Where("uid=?", m.Uid)
} }
resp := &UserDepositRefundRecordListResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,
}
page := m.PageNum - 1 page := m.PageNum - 1
if page < 0 { if page < 0 {
page = 0 page = 0
@ -2635,14 +2641,14 @@ func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDeposit
if m.PageSize == 0 { if m.PageSize == 0 {
m.PageSize = 10 m.PageSize = 10
} }
resp := &UserDepositRefundRecordListResp{PageNum: m.PageNum}
var count int64 var count int64
err := qs.Count(&count).Error err := qs.Count(&count).Error
if err != nil { if err != nil {
logger.Error("count err:", logger.Field("err", err)) logger.Error("count err:", logger.Field("err", err))
return resp, err return resp, err
} }
resp.Count = uint32(count) resp.Total = int(count)
var depositRefunds []DepositRefundRecord var depositRefunds []DepositRefundRecord
err = qs.Order("status ASC").Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&depositRefunds).Error err = qs.Order("status ASC").Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&depositRefunds).Error
@ -3674,17 +3680,21 @@ type ExpireMemberSmsSendListReq struct {
//EndTime string `json:"end_time"` // 结束时间 //EndTime string `json:"end_time"` // 结束时间
StartTime time.Time `json:"start_time"` // 开始时间 StartTime time.Time `json:"start_time"` // 开始时间
EndTime time.Time `json:"end_time"` // 结束时间 EndTime time.Time `json:"end_time"` // 结束时间
PageNum int `json:"page_num"` PageIndex int `json:"pageIndex"`
PageSize int `json:"page_size"` PageSize int `json:"pageSize"`
} }
type ExpireMemberSmsSendListResp struct { type ExpireMemberSmsSendListResp struct {
List []ExpireMemberSmsSend `json:"list"` List []ExpireMemberSmsSend `json:"list"`
Count uint32 `json:"count"` Total int `json:"total"` // 总条数
PageNum int `json:"pageIndex"` PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页展示条数
} }
func (m *ExpireMemberSmsSendListReq) List() (*ExpireMemberSmsSendListResp, error) { func (m *ExpireMemberSmsSendListReq) List() (*ExpireMemberSmsSendListResp, error) {
resp := &ExpireMemberSmsSendListResp{PageNum: m.PageNum} resp := &ExpireMemberSmsSendListResp{
PageIndex: m.PageIndex,
PageSize: m.PageSize,
}
qs := orm.Eloquent.Table("expire_member_sms_send") qs := orm.Eloquent.Table("expire_member_sms_send")
if m.Status != 0 { if m.Status != 0 {
qs = qs.Where("status=?", m.Status) qs = qs.Where("status=?", m.Status)
@ -3716,7 +3726,7 @@ func (m *ExpireMemberSmsSendListReq) List() (*ExpireMemberSmsSendListResp, error
parse := m.EndTime.AddDate(0, 0, 1) parse := m.EndTime.AddDate(0, 0, 1)
qs = qs.Where("send_time < ?", parse) qs = qs.Where("send_time < ?", parse)
} }
page := m.PageNum - 1 page := m.PageIndex - 1
if page < 0 { if page < 0 {
page = 0 page = 0
} }
@ -3730,7 +3740,7 @@ func (m *ExpireMemberSmsSendListReq) List() (*ExpireMemberSmsSendListResp, error
logger.Error("count err:", logger.Field("err", err)) logger.Error("count err:", logger.Field("err", err))
return resp, err return resp, err
} }
resp.Count = uint32(count) resp.Total = int(count)
var smsSends []ExpireMemberSmsSend var smsSends []ExpireMemberSmsSend
err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&smsSends).Error err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&smsSends).Error

View File

@ -31,7 +31,7 @@ func registerOrderManageUnAuthRouter(v1 *gin.RouterGroup) {
order.POST("/del", ordermanage.OrderDel) // 订单删除 order.POST("/del", ordermanage.OrderDel) // 订单删除
order.POST("/refund", ordermanage.OrderRefund) // 订单退款 order.POST("/refund", ordermanage.OrderRefund) // 订单退款
order.POST("/express_no/list", ordermanage.ExpressNoList) // 物流单列表 order.POST("/express_no/list", ordermanage.ExpressNoList) // 物流单列表
order.POST("/fund_record/list", ordermanage.FundRecordList) // 物流单列表 order.POST("/fund_record/list", ordermanage.FundRecordList) // 财务统计列表
//order.POST("/type", goodsmanage.GameCardTypes) // 获取游戏类型 //order.POST("/type", goodsmanage.GameCardTypes) // 获取游戏类型
} }

View File

@ -29,7 +29,7 @@ func registerUserManageUnAuthRouter(v1 *gin.RouterGroup) {
userInfo.POST("/cancel_members", usermanage.CancelMembers) userInfo.POST("/cancel_members", usermanage.CancelMembers)
userInfo.POST("/user_derive", usermanage.ExportDataUserMember) userInfo.POST("/user_derive", usermanage.ExportDataUserMember)
userInfo.POST("/deposit_refund/list", usermanage.UserDepositRefundRecordList) userInfo.POST("/deposit_refund/list", usermanage.UserDepositRefundRecordList) // 保证金审核列表
userInfo.POST("/deposit_refund/notarize", usermanage.NotarizeUserDepositRefund) // 退押金审核 userInfo.POST("/deposit_refund/notarize", usermanage.NotarizeUserDepositRefund) // 退押金审核
userInfo.POST("/deposit_refund/refused", usermanage.NotarizeUserDepositRefused) userInfo.POST("/deposit_refund/refused", usermanage.NotarizeUserDepositRefused)
userInfo.POST("/xcx_role_list", usermanage.XcxRoleList) userInfo.POST("/xcx_role_list", usermanage.XcxRoleList)
@ -38,7 +38,7 @@ func registerUserManageUnAuthRouter(v1 *gin.RouterGroup) {
userInfo.POST("/member_record_list_export", usermanage.UserMemberRecordListExport) userInfo.POST("/member_record_list_export", usermanage.UserMemberRecordListExport)
userInfo.POST("/member_statistic_list", usermanage.UserMemberStatisticList) userInfo.POST("/member_statistic_list", usermanage.UserMemberStatisticList)
userInfo.POST("/user_invite_record_list", usermanage.UserInviteRecordList) userInfo.POST("/user_invite_record_list", usermanage.UserInviteRecordList)
userInfo.POST("/expire_member_sms_list", usermanage.ExpireMemberSmsSendRecordList) userInfo.POST("/expire_member_sms_list", usermanage.ExpireMemberSmsSendRecordList) // 短信记录列表
} }

View File

@ -132,6 +132,7 @@ func run() error {
//if err != nil { //if err != nil {
// fmt.Println("err:", err) // fmt.Println("err:", err)
//} //}
// 用户收回卡绑定卡 // 用户收回卡绑定卡
err = s.Every(1).Day().At("00:00").Do(models.ShareCardRetrieveCardSetStockCardCron) err = s.Every(1).Day().At("00:00").Do(models.ShareCardRetrieveCardSetStockCardCron)
if err != nil { if err != nil {

View File

@ -30,8 +30,8 @@ settings:
enabledjob: false enabledjob: false
jwt: jwt:
# token 密钥,生产环境时及的修改 # token 密钥,生产环境时及的修改
secret: go-admin # secret: go-admin
# secret: adminqYrhCcQRvVNAaEo4h4osoW secret: adminqYrhCcQRvVNAaEo4h4osoW
# token 过期时间 单位:秒 # token 过期时间 单位:秒
timeout: 3600 timeout: 3600
database: database:
@ -39,9 +39,10 @@ settings:
driver: mysql driver: mysql
# 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms
# source: root:myTest@921@tcp(127.0.0.1:3306)/mh_dev?charset=utf8&parseTime=True&loc=Local&timeout=1000ms # source: root:myTest@921@tcp(127.0.0.1:3306)/mh_dev?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
source: mh_dev:d9qy46ONI0ZTF9eH@tcp(112.33.14.191:3306)/mh_dev?charset=utf8&parseTime=True&loc=Local&timeout=1000ms # source: mh_dev:d9qy46ONI0ZTF9eH@tcp(112.33.14.191:3306)/mh_dev?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
# source: mh_pro:c5JBW3X6EEVQluYM@tcp(39.108.188.218:3306)/mh_pro?charset=utf8&parseTime=True&loc=Local&timeout=1000ms # source: mh_pro:c5JBW3X6EEVQluYM@tcp(39.108.188.218:3306)/mh_pro?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
# source: mh_test:GPLzZ8rMmbJbKtMh@tcp(112.33.14.191:3306)/mh_test?charset=utf8&parseTime=True&loc=Local&timeout=1000ms # source: mh_test:GPLzZ8rMmbJbKtMh@tcp(112.33.14.191:3306)/mh_test?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
source: mh_new_pro:YnzexdTfBHMSGZki@tcp(39.108.188.218:3306)/mh_new_pro?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
gen: gen:
# 代码生成读取的数据库名称 # 代码生成读取的数据库名称