package logic import ( "context" "lone-services/pkg/modelbase" "lone-services/pkg/utils" "lone-services/rpc/express/pb" "lone-services/services/express/internal/dao" "lone-services/services/express/internal/model" "lone-services/services/express/internal/svc" "lone-services/services/express/internal/transit" "strconv" jsoniter "github.com/json-iterator/go" "github.com/zeromicro/go-zero/core/logx" ) type ExpressJdBackLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger BaseLogic } func NewExpressJdBackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ExpressJdBackLogic { return &ExpressJdBackLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *ExpressJdBackLogic) ExpressJdBack(in *express.JdRequest) (*express.SfResponse, error) { //TODO 透传数据还是获取? l.Logger.Error(in) //routers.POST("/transit/jd", obj.JdBack) //appKey := c.Query("app_key") //timestamp := c.Query("timestamp") //sign := c.Query("sign") //path := c.Query("path") // //l.Logger.Info("JD back params : app_key=", appKey, // " timestamp=", timestamp, " sign=", sign, " path=", path) //JD back params : app_key=e99f6232b45c4c3e871780f5a9b1a555 timestamp=Tue, 26 May 2026 01:41:06 GMT sign=2640A486A4A529AAD722FED2E5C7E0BB path= //JD back data:{"carrierId":2087,"customerOrderNo":"JD2026052609395822530404255","extend":{"curSiteName":"张家口涿鹿汽车点部项目小站","curSiteId":"1929145","siteTelephone":"15732381119","siteId":"4989","remark":"【实时调度-路区排班】揽收任务已分配给李晓龙,配送员电话13833376743","operatorPhone":"13833376743","curJDCode":"34512","requireTime":"2026-05-27 22:00:00"},"nextLocation":{},"operateLocation":{"lat":"40.459022","lon":"115.276425","routeAddress":" 河北省张家口市下花园区S342(张家口农商银行苏家坊信用社南)","routeCityName":"张家口市","routeDistrictName":"涿鹿县","routeProvinceName":"河北","routeStreetName":"涿鹿镇"},"operateSite":"张家口涿鹿汽车点部项目小站","operateSiteId":"1929145","operationCode":"200034","operationTime":"2026-05-26 09:40:11","operationType":"2013","operatorName":"李晓龙","orderNo":"JD2026052609395822530404255","remark":"您的快件将由快递员李晓龙上门取件,快递员电话:13833376743,营业部电话:15732381119","waybillNo":"JDVA44161571823"} body := utils.GetBody(l.ctx) ret := express.SfResponse{ ReturnCode: "1001", ReturnMsg: "body获取失败", } if body == utils.StringEmpty { return &ret, nil } l.Logger.Info("JD back data:", body) ret.ReturnCode = "1002" ret.ReturnMsg = "系统异常" ok := l.JdBack(body) if ok { ret.ReturnCode = "000" ret.ReturnMsg = "成功" } return &ret, nil } func (l *ExpressJdBackLogic) JdBack(body string) bool { var bodyData map[string]interface{} err := jsoniter.Unmarshal([]byte(body), &bodyData) if err != nil { l.Logger.Error("back body strInt error ", err) return false } result, ok := bodyData["Body"].(map[string]interface{}) if !ok { l.Logger.Error("back Body interface error ") return false } l.Logger.Error("back body strInt result ", result) waybillNo := utils.GetStringByMap(result, "waybillNo") if waybillNo == utils.StringEmpty { l.Logger.Error("back body no id error ") return false } w := modelbase.Params{Eq: map[string]string{ "status": strconv.Itoa(dao.SendStatusOk), "transit_type": strconv.Itoa(dao.ExpressCompanyJd), "transit_sn": waybillNo}} var info dao.DeliveryOrderUpTransit modelObj := model.DeliveryOrderModel{}.Init() err = modelObj.GetOne(w, &info) if err != nil || info.Id < utils.NumberOne { l.Logger.Error("没有找到快递数据", err) return true } var items []dao.ExpressQueryItems if len(info.TransitQuery) > utils.NumberTen { ok := utils.JsonStringToStruct(info.TransitQuery, &items) if ok != true { l.Logger.Error("back json error ", err) return false } } tmp := dao.ExpressQueryItems{ Remark: result["remark"].(string), AcceptTime: result["operationTime"].(string), OperatorName: result["operatorName"].(string), OpCode: result["operationCode"].(string), AllInfo: body, } tmp.LastMd5 = utils.MD5Encrypt(tmp.Remark + tmp.AcceptTime + tmp.OperatorName) if len(items) > utils.NumberZero { if items[len(items)-utils.NumberOne].LastMd5 == tmp.LastMd5 { return true } } items = append(items, tmp) info.TransitQuery = utils.StructToJson(items) modelObj.Begin() if ok := transit.JdSingedCodeMap[tmp.OpCode]; ok { w = modelbase.Params{Eq: map[string]string{"deliver_goods_id": strconv.Itoa(info.Id)}} expEdit := dao.DeliveryExpStatus{ Status: utils.StatusOk, } _, err = model.DeliveryOrderExpModel{}.Init().Edit(w, &expEdit) if err != nil { l.Logger.Error("back set deliver exp error ", err) modelObj.Rollback() return false } info.Status = dao.SendStatusOver info.ChangeEstimatedTime = utils.StatusFail info.SignTime = utils.Now() s := svc.UpOrderDeliverStatus(l.svcCtx.OrderSvcName, info.ObjId, int(info.Type), int32(info.Status)) if s != utils.Ok { modelObj.Rollback() return false } } _, err = modelObj.Edit(w, &info) if err != nil { modelObj.Rollback() l.Logger.Error("back edit error ", err) return false } modelObj.Commit() return true }