qnc-server-old/service/car.go
2024-09-14 10:48:09 +08:00

355 lines
9.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}