package service import ( "encoding/base64" "encoding/hex" "encoding/json" "errors" "github.com/gin-gonic/gin" "log" "qnc-server/config" "qnc-server/db" "qnc-server/model/model" "qnc-server/utils" "time" ) type CarService struct { } func (c *CarService) CarReqYuShan(prodID string, data *map[string]interface{}) (plainText []byte, err error) { currentTime := time.Now() unixMilliseconds := currentTime.UnixNano() / int64(time.Millisecond) requestSN, _ := utils.GenerateRandomString() apiKey := config.ConfigData.Car.ApiKey acctId := config.ConfigData.Car.AcctId httpUrl := config.ConfigData.Car.HttpUrl // 根据 ProdID 动态构建请求数据 reqData := map[string]interface{}{ "prod_id": prodID, "req_time": unixMilliseconds, "request_sn": requestSN, "req_data": data, } messageBytes, err := json.Marshal(reqData) if err != nil { return } key, err := hex.DecodeString(apiKey) if err != nil { return } //加密 cipherText := utils.AES_CBC_Encrypt(messageBytes, key) content := base64.StdEncoding.EncodeToString(cipherText) respStr, err := httpDo(httpUrl, content, acctId) if err != nil { return } //解密 sDec, err := base64.StdEncoding.DecodeString(respStr) if err != nil { if utils.IsJSON(respStr) { return []byte(respStr), nil } return } plainText = utils.AES_CBC_Decrypt(sDec, key) return } // 对返回信息进行处理,返回一份完整的报告 func (c *CarService) CarInsuranceDataAnalysis(respString string) (data map[string]interface{}, err error) { var resp model.YuShanResponse[map[string]interface{}] err = json.Unmarshal([]byte(respString), &resp) if err != nil { log.Printf("CarInsurance Unmarshal error:%v", err) return nil, utils.ErrSystemError } if resp.Retcode == RetCodeSuccess { data = resp.Retdata return data, nil } else if resp.Retcode == RetCodeEmpty { log.Printf("Car resp empty:%s", resp.Retmsg) return data, utils.ErrNoRecord } else { log.Printf("Car resp error:%s", resp.Retmsg) return data, utils.ErrSystemError } } // 对返回信息进行处理,返回一份完整的报告 func (c *CarService) CarDataAnalysis(respString string) (data model.YuShanResponse[map[string]interface{}], err error) { err = json.Unmarshal([]byte(respString), &data) if err != nil { log.Printf("CarInsurance Unmarshal error:%v", err) return data, utils.ErrUnmashal } if data.Retcode == RetCodeSuccess { return data, nil } else if data.Retcode == RetCodeEmpty { log.Printf("Car resp empty:%s", data.Retmsg) return data, utils.ErrNoRecord } else { log.Printf("Car resp error:%s", data.Retmsg) return data, utils.ErrSystemError } } // 对返回信息进行处理,返回一份完整的报告 人车核验特殊版 func (c *CarService) CarPersonCarVerifyDataAnalysis(respString string) (data map[string]interface{}, err error) { var resp model.YuShanResponse[map[string]interface{}] err = json.Unmarshal([]byte(respString), &resp) if err != nil { log.Printf("CarPersonCarVerifyDataAnalysis Unmarshal error:%v", err) return nil, utils.ErrSystemError } if resp.Retcode == RetCodeSuccess { if resp.Retdata == nil { log.Printf("Car resp empty:%s", resp.Retmsg) return data, utils.ErrNoRecord } else { data = resp.Retdata return data, nil } } else if resp.Retcode == RetCodeEmpty { log.Printf("Car resp empty:%s", resp.Retmsg) return data, utils.ErrNoRecord } else { log.Printf("Car resp error:%s", resp.Retmsg) return data, utils.ErrSystemError } } func (c *CarService) GetRecordByFeature(feature string, id uint, userID uint) (interface{}, error) { var result interface{} switch feature { case "chexian": var record model.CarInsurance if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "weibao": var record model.CarMaintenance if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "rencheheyan": var record model.CarPersonCarVerify if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarPersonCarVerifyDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "mingxiacheliang": var record model.CarUnderName if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "cheliangshangxian": var record model.CarInsuranceInfo if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysisSx, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } analysisWx, err := c.CarInsuranceDataAnalysis(record.FiveResp) if err != nil { return nil, err } result = gin.H{ "shangxian": analysisSx, "chewuxiang": analysisWx, } case "cheliangguohu": var record model.CarVehicleTransfer if err := db.DB.Where("order_id = ?", id).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "vinchache": var record model.CarVinCheckInfo if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "cheliangguzhi": var record model.CarVehicleValuation if err := db.DB.Where("order_id = ? AND userid = ?", id, userID).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis default: return nil, errors.New("Invalid feature") } return result, nil } func (c *CarService) GetRecordCaseByFeature(feature string) (interface{}, error) { var result interface{} switch feature { case "chexian": var record model.CarInsurance if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "weibao": var record model.CarMaintenance if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "mingxiacheliang": var record model.CarUnderName if err := db.DB.Where("id = ? ", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "rencheheyan": var record model.CarPersonCarVerify if err := db.DB.Where("id = ? ", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarPersonCarVerifyDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "cheliangshangxian": var record model.CarInsuranceInfo if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysisSx, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } analysisWx, err := c.CarInsuranceDataAnalysis(record.FiveResp) if err != nil { return nil, err } result = gin.H{ "shangxian": analysisSx, "chewuxiang": analysisWx, } case "vinchache": var record model.CarVinCheckInfo if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "cheliangguohu": var record model.CarVehicleTransfer if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis case "cheliangguzhi": var record model.CarVehicleValuation if err := db.DB.Where("id = ?", 1).First(&record).Error; err != nil { return nil, err } analysis, err := c.CarInsuranceDataAnalysis(record.Resp) if err != nil { return nil, err } result = analysis default: return nil, errors.New("Invalid feature") } return result, nil } func (c *CarService) DecodeYushan(resp []byte) (plainText []byte, err error) { apiKey := config.ConfigData.Car.ApiKey key, err := hex.DecodeString(apiKey) if err != nil { return } respStr := string(resp) sDec, err := base64.StdEncoding.DecodeString(respStr) if err != nil { if utils.IsJSON(respStr) { log.Printf("车辆维保记录CAR058回调 DecodeJSON err:%s", respStr) return []byte(respStr), nil } } plainText = utils.AES_CBC_Decrypt(sDec, key) return plainText, nil } func (c *CarService) GetMaintenanceBySn(sn string) (maintenance *model.CarMaintenance, err error) { err = db.DB.Where("notify_sn = ?", sn).First(&maintenance).Error if err != nil { return nil, err } return maintenance, nil } func (c *CarService) GetMaintenanceList(pageSize int, pageNum int, userId uint) (list []model.CarMaintenance, err error) { offset := (pageNum - 1) * pageSize result := db.DB.Model(&model.CarMaintenance{}). Select("id, created_at, updated_at, order_id, status, userid, vin"). Where("userid = ?", userId).Order("id desc"). Limit(pageSize). Offset(offset). Find(&list) if result.Error != nil { return list, result.Error } return list, nil }