355 lines
9.8 KiB
Go
355 lines
9.8 KiB
Go
|
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
|
|||
|
}
|