2025-03-25 08:30:09 +00:00
|
|
|
|
package logic
|
|
|
|
|
|
|
|
|
|
import (
|
2025-05-28 01:34:43 +00:00
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
2025-03-25 08:30:09 +00:00
|
|
|
|
"micro-bundle/internal/dao"
|
|
|
|
|
"micro-bundle/internal/model"
|
|
|
|
|
"micro-bundle/pb/bundle"
|
2025-05-28 01:34:43 +00:00
|
|
|
|
"micro-bundle/pkg/app"
|
2025-03-28 01:23:17 +00:00
|
|
|
|
"micro-bundle/pkg/msg"
|
2025-05-28 01:34:43 +00:00
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
2025-03-25 08:30:09 +00:00
|
|
|
|
|
|
|
|
|
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
|
2025-05-28 01:34:43 +00:00
|
|
|
|
"gorm.io/gorm"
|
2025-03-25 08:30:09 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 增值套餐创建
|
2025-03-28 01:23:17 +00:00
|
|
|
|
func CreateValueAddBundle(req *bundle.CreateValueAddBundleRequest) (res *bundle.CreateValueAddBundleResponse, err error) {
|
|
|
|
|
res = &bundle.CreateValueAddBundleResponse{}
|
2025-03-25 08:30:09 +00:00
|
|
|
|
|
2025-03-28 01:23:17 +00:00
|
|
|
|
savedAmount := float32(req.Num * (msg.OriginalPrice - msg.DiscountPrice))
|
|
|
|
|
totalPrice := float32(req.Num * msg.DiscountPrice)
|
|
|
|
|
|
|
|
|
|
valueAddBundleProfile := &model.ValueAddBundleProfile{
|
|
|
|
|
UUID: utils.GetUUID(),
|
|
|
|
|
Num: req.Num,
|
|
|
|
|
OriginalPrice: msg.OriginalPrice,
|
|
|
|
|
DiscountPrice: msg.DiscountPrice,
|
|
|
|
|
SavedAmount: savedAmount,
|
|
|
|
|
TotalPrice: totalPrice,
|
2025-03-28 18:05:56 +00:00
|
|
|
|
//Type: msg.Custom,
|
2025-03-28 01:23:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = dao.CreateValueAddBundle(valueAddBundleProfile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
res.Msg = msg.ErrorCreateValueAddBundleInfo
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.Uuid = valueAddBundleProfile.UUID
|
|
|
|
|
res.TotalPrice = totalPrice
|
|
|
|
|
res.SavedAmount = savedAmount
|
|
|
|
|
res.Msg = msg.SuccessCreateValueAddBundleInfo
|
2025-03-25 08:30:09 +00:00
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 增值套餐列表
|
|
|
|
|
func ValueAddBundleList(req *bundle.ValueAddBundleListRequest) (res *bundle.ValueAddBundleListResponse, err error) {
|
2025-03-28 01:23:17 +00:00
|
|
|
|
res = &bundle.ValueAddBundleListResponse{}
|
2025-03-28 20:59:56 +00:00
|
|
|
|
var bundleCommonUid string
|
2025-03-28 23:33:16 +00:00
|
|
|
|
var bundleProfile *model.BundleProfile
|
|
|
|
|
bundleProfile, err = dao.BundleProfileDetail(req.BundleUuid)
|
2025-03-28 08:47:41 +00:00
|
|
|
|
if err != nil {
|
2025-03-28 23:33:16 +00:00
|
|
|
|
return
|
2025-03-28 08:47:41 +00:00
|
|
|
|
} else {
|
2025-03-28 23:33:16 +00:00
|
|
|
|
var bundleOrderRecord *model.BundleOrderRecords
|
2025-03-29 03:22:19 +00:00
|
|
|
|
bundleOrderRecord, err = dao.GetBundleOrderRecordsByCommonUidAndUserId(bundleProfile.BundleCommonUid, req.UserId)
|
2025-03-28 23:33:16 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
err = nil
|
|
|
|
|
} else {
|
|
|
|
|
bundleCommonUid = bundleOrderRecord.BundleCommonUid
|
|
|
|
|
res.OrderNo = true
|
|
|
|
|
res.Price = bundleOrderRecord.ValueAddBundleAmount
|
|
|
|
|
res.Num = bundleOrderRecord.Num
|
|
|
|
|
|
|
|
|
|
if bundleOrderRecord.ValueAddBundleUUID != "" {
|
|
|
|
|
res.Status = true
|
|
|
|
|
}
|
2025-03-28 08:47:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-28 18:05:56 +00:00
|
|
|
|
valueAddBundleProfile, err := dao.ValueAddBundleList(req.PriceType)
|
2025-03-28 01:23:17 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
res.Msg = msg.ErrorGetValueAddBundleList
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, valueAddBundle := range valueAddBundleProfile {
|
2025-03-28 08:47:41 +00:00
|
|
|
|
valueAddBundleProfileInfo := &bundle.ValueAddBundleProfile{
|
2025-03-28 01:23:17 +00:00
|
|
|
|
Uuid: valueAddBundle.UUID,
|
|
|
|
|
Num: valueAddBundle.Num,
|
|
|
|
|
OriginalPrice: valueAddBundle.OriginalPrice,
|
|
|
|
|
DiscountPrice: valueAddBundle.DiscountPrice,
|
|
|
|
|
TotalPrice: valueAddBundle.TotalPrice,
|
|
|
|
|
SavedAmount: valueAddBundle.SavedAmount,
|
|
|
|
|
DiscountPriceStatus: valueAddBundle.DiscountPriceStatus,
|
|
|
|
|
Choose: valueAddBundle.Choose,
|
2025-03-28 08:47:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-28 20:59:56 +00:00
|
|
|
|
if bundleCommonUid == valueAddBundle.AddBundleCommonUid {
|
2025-03-28 08:47:41 +00:00
|
|
|
|
valueAddBundleProfileInfo.Status = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.Data = append(res.Data, valueAddBundleProfileInfo)
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-28 01:23:17 +00:00
|
|
|
|
res.OriginalPrice = msg.OriginalPrice
|
|
|
|
|
res.Total = int32(len(valueAddBundleProfile))
|
|
|
|
|
res.Msg = "SUCCESS"
|
|
|
|
|
|
2025-03-25 08:30:09 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 增值套餐详情
|
|
|
|
|
func ValueAddBundleDetail(req *bundle.ValueAddBundleDetailRequest) (res *bundle.ValueAddBundleDetailResponse, err error) {
|
2025-03-28 01:23:17 +00:00
|
|
|
|
res = &bundle.ValueAddBundleDetailResponse{}
|
|
|
|
|
|
|
|
|
|
valueAddBundleProfile := &model.ValueAddBundleProfile{}
|
|
|
|
|
valueAddBundleProfile, err = dao.ValueAddBundleDetail(req.Uuid)
|
2025-03-25 08:30:09 +00:00
|
|
|
|
if err != nil {
|
2025-03-28 01:23:17 +00:00
|
|
|
|
res.Msg = msg.ErrorGetValueAddBundleInfo
|
|
|
|
|
return res, err
|
2025-03-25 08:30:09 +00:00
|
|
|
|
}
|
2025-03-28 01:23:17 +00:00
|
|
|
|
|
|
|
|
|
res.Data = &bundle.ValueAddBundleProfile{
|
|
|
|
|
Uuid: valueAddBundleProfile.UUID,
|
|
|
|
|
Num: valueAddBundleProfile.Num,
|
|
|
|
|
OriginalPrice: valueAddBundleProfile.OriginalPrice,
|
|
|
|
|
DiscountPrice: valueAddBundleProfile.DiscountPrice,
|
|
|
|
|
TotalPrice: valueAddBundleProfile.TotalPrice,
|
|
|
|
|
SavedAmount: valueAddBundleProfile.SavedAmount,
|
|
|
|
|
DiscountPriceStatus: valueAddBundleProfile.DiscountPriceStatus,
|
|
|
|
|
Choose: valueAddBundleProfile.Choose,
|
2025-03-28 20:59:56 +00:00
|
|
|
|
AddBundleCommonUid: valueAddBundleProfile.AddBundleCommonUid,
|
2025-03-28 01:23:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-28 02:54:04 +00:00
|
|
|
|
bundleOrderRecords := &model.BundleOrderRecords{}
|
|
|
|
|
bundleOrderRecords, err = dao.BundleOrderRecordsDetailByAddUid(req.Uuid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
err = nil
|
|
|
|
|
} else {
|
|
|
|
|
res.PayTime = bundleOrderRecords.PayTime
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-28 01:23:17 +00:00
|
|
|
|
res.Msg = "SUCCESS"
|
2025-03-25 08:30:09 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
2025-05-28 01:34:43 +00:00
|
|
|
|
|
|
|
|
|
//*******************************************************************新增值服务***********************
|
|
|
|
|
|
|
|
|
|
// 增值套餐保存(无则新增,有则更新)
|
|
|
|
|
func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveResponse, err error) {
|
|
|
|
|
res = &bundle.SaveResponse{}
|
|
|
|
|
if in.Language == "" {
|
|
|
|
|
return res, errors.New("语言参数不能为空")
|
|
|
|
|
}
|
|
|
|
|
var options model.PriceOptions
|
|
|
|
|
for _, option := range in.Options {
|
|
|
|
|
price, parseErr := strconv.ParseFloat(option.Price, 32)
|
|
|
|
|
if parseErr != nil {
|
|
|
|
|
return res, parseErr
|
|
|
|
|
}
|
|
|
|
|
options = append(options, &model.PriceOption{
|
|
|
|
|
Id: int32(option.Id),
|
|
|
|
|
Num: option.Num,
|
|
|
|
|
Symbol: option.Symbol,
|
|
|
|
|
Price: float32(price),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
ok, err := model.ValidateOptions(options)
|
|
|
|
|
if !ok {
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
valueAddService := &model.ValueAddService{
|
|
|
|
|
ServiceName: in.ServiceName,
|
|
|
|
|
ServiceType: in.ServiceType,
|
|
|
|
|
}
|
|
|
|
|
originalPrice, err := strconv.ParseFloat(in.OriginalPrice, 32)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
valueAddServiceLang := &model.ValueAddServiceLang{
|
|
|
|
|
ServiceName: in.ServiceName,
|
|
|
|
|
ServiceType: in.ServiceType,
|
|
|
|
|
PriceMode: int32(in.PriceMode),
|
|
|
|
|
OriginalPrice: float32(originalPrice),
|
|
|
|
|
Unit: in.Unit,
|
|
|
|
|
Language: in.Language,
|
|
|
|
|
PriceType: in.PriceType,
|
|
|
|
|
Options: options,
|
|
|
|
|
}
|
|
|
|
|
if in.Uuid == "" && in.Language != msg.ZH_CN {
|
|
|
|
|
return res, errors.New("请先新增简体中文套餐,再添加其他语言版本")
|
|
|
|
|
}
|
|
|
|
|
tx := app.ModuleClients.BundleDB.Begin()
|
|
|
|
|
defer func() {
|
|
|
|
|
if err != nil {
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
} else {
|
|
|
|
|
tx.Commit()
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
// 检查当前语言套餐是否存在
|
|
|
|
|
_, err = dao.ValueAddServiceDetailByUuidAndLanguage(in.Uuid, in.Language)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if err == gorm.ErrRecordNotFound { // 当前语言套餐不存在
|
|
|
|
|
if in.Language != msg.ZH_CN {
|
|
|
|
|
_, err = dao.ValueAddServiceDetailByUuidAndLanguage(in.Uuid, msg.ZH_CN)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if err != gorm.ErrRecordNotFound {
|
|
|
|
|
return res, errors.New("请先创建中文套餐")
|
|
|
|
|
} else {
|
|
|
|
|
// // 新语言补充:只要UUID存在即可直接插入新语言
|
|
|
|
|
// if in.Uuid != "" {
|
|
|
|
|
// valueAddServiceLang.UUID = in.Uuid
|
|
|
|
|
// if err = dao.CreateValueAddServiceLang(tx, valueAddServiceLang); err != nil {
|
|
|
|
|
// return res, errors.New("补充新语言套餐失败: " + err.Error())
|
|
|
|
|
// }
|
|
|
|
|
// res.Uuid = in.Uuid
|
|
|
|
|
// res.Msg = "补充新语言套餐成功"
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if in.Language == msg.ZH_CN {
|
|
|
|
|
valueAddService.UUID = utils.GetUUID()
|
|
|
|
|
err = dao.CreateValueAddService(tx, valueAddService)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return res, errors.New("保存中文语言套餐失败: " + err.Error())
|
|
|
|
|
}
|
|
|
|
|
valueAddServiceLang.UUID = valueAddService.UUID
|
|
|
|
|
res.Uuid = valueAddService.UUID
|
|
|
|
|
if err = dao.CreateValueAddServiceLang(tx, valueAddServiceLang); err != nil {
|
|
|
|
|
return res, errors.New("保存语言套餐失败: " + err.Error())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JS_JP}
|
|
|
|
|
for _, lang := range langList {
|
|
|
|
|
otherLang := *valueAddServiceLang
|
|
|
|
|
otherLang.Language = lang
|
|
|
|
|
if err = dao.CreateValueAddServiceLang(tx, &otherLang); err != nil {
|
|
|
|
|
return res, errors.New(fmt.Sprintf("保存%s语言套餐失败: ", lang) + err.Error())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
res.Msg = "保存成功"
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 已存在,进行更新
|
|
|
|
|
//中文状态下,更新主表和语言表
|
|
|
|
|
if in.Language == msg.ZH_CN {
|
|
|
|
|
updateService := map[string]interface{}{
|
|
|
|
|
"uuid": in.Uuid,
|
|
|
|
|
"service_name": in.ServiceName,
|
|
|
|
|
"service_type": in.ServiceType,
|
|
|
|
|
}
|
|
|
|
|
if err = dao.UpdateValueAddService(tx, updateService); err != nil {
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 查找所有与该增值服务关联的套餐,若币种不一致则取消关联并统计
|
|
|
|
|
var cancelNum int64 = 0
|
|
|
|
|
bundleToValueAddList, _ := dao.GetBundleToValueAddServiceByValueUid(in.Uuid)
|
|
|
|
|
for _, rel := range bundleToValueAddList {
|
|
|
|
|
bundleProfile, _ := dao.BundleDetailByUuidAndLanguage(rel.BundleUuid, in.Language)
|
|
|
|
|
if bundleProfile != nil && bundleProfile.PriceType != in.PriceType {
|
|
|
|
|
dao.DeleteBundleToValueAddService(tx, rel.BundleUuid, in.Uuid)
|
|
|
|
|
cancelNum++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//更新语言表
|
|
|
|
|
updateLangService := map[string]interface{}{
|
|
|
|
|
"uuid": in.Uuid,
|
|
|
|
|
"service_name": in.ServiceName,
|
|
|
|
|
"service_type": in.ServiceType,
|
|
|
|
|
"price_mode": in.PriceMode,
|
|
|
|
|
"original_price": in.OriginalPrice,
|
|
|
|
|
"unit": in.Unit,
|
|
|
|
|
"price_type": in.PriceType,
|
|
|
|
|
"options": options,
|
|
|
|
|
"language": in.Language,
|
|
|
|
|
}
|
|
|
|
|
if err = dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil {
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
res.Uuid = in.Uuid
|
|
|
|
|
res.Msg = "保存成功"
|
|
|
|
|
res.CancelNum = cancelNum
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 增值套餐列表
|
|
|
|
|
func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.ValueAddServiceListResponse, err error) {
|
|
|
|
|
res = &bundle.ValueAddServiceListResponse{}
|
|
|
|
|
list, total, err := dao.ValueAddServiceList(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
res.Msg = msg.ErrorValueAddServiceList
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
for _, valueAddService := range list {
|
|
|
|
|
serviceInfo := &bundle.ValueAddService{
|
|
|
|
|
Uuid: valueAddService.UUID,
|
|
|
|
|
ServiceName: valueAddService.ServiceName,
|
|
|
|
|
ServiceType: valueAddService.ServiceType,
|
|
|
|
|
}
|
|
|
|
|
for _, serviceLang := range valueAddService.ValueAddServiceLang {
|
|
|
|
|
serviceLangInfo := &bundle.ValueAddServiceLang{
|
|
|
|
|
Uuid: valueAddService.UUID,
|
|
|
|
|
ServiceName: serviceLang.ServiceName,
|
|
|
|
|
ServiceType: serviceLang.ServiceType,
|
|
|
|
|
PriceMode: serviceLang.PriceMode,
|
|
|
|
|
OriginalPrice: fmt.Sprintf("%.2f", serviceLang.OriginalPrice),
|
|
|
|
|
Unit: serviceLang.Unit,
|
|
|
|
|
PriceType: int64(serviceLang.PriceType),
|
|
|
|
|
Language: serviceLang.Language,
|
|
|
|
|
CreatedAt: time.Unix(serviceLang.CreatedAt, 0).Format("2006-01-02 15:04:05"),
|
|
|
|
|
UpdatedAt: time.Unix(serviceLang.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
|
|
|
|
|
}
|
|
|
|
|
if serviceLang.Options != nil && len(serviceLang.Options) > 0 {
|
|
|
|
|
var options []*bundle.ValueAddPriceOptions
|
|
|
|
|
for _, option := range serviceLang.Options {
|
|
|
|
|
options = append(options, &bundle.ValueAddPriceOptions{
|
|
|
|
|
Id: int64(option.Id),
|
|
|
|
|
Num: option.Num,
|
|
|
|
|
Symbol: option.Symbol,
|
|
|
|
|
Price: fmt.Sprintf("%.2f", option.Price),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
serviceLangInfo.Options = options
|
|
|
|
|
}
|
|
|
|
|
serviceInfo.ServiceLang = append(serviceInfo.ServiceLang, serviceLangInfo)
|
|
|
|
|
}
|
|
|
|
|
res.ValueAddServiceList = append(res.ValueAddServiceList, serviceInfo)
|
|
|
|
|
}
|
|
|
|
|
res.Total = int32(total)
|
|
|
|
|
res.Msg = msg.SuccessValueAddServiceList
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 增值套餐详情
|
|
|
|
|
func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundle.ValueAddServiceDetailResponse, err error) {
|
|
|
|
|
res = &bundle.ValueAddServiceDetailResponse{}
|
|
|
|
|
if req.Uuid == "" {
|
|
|
|
|
res.Msg = msg.ErrorValueAddServiceInfo
|
|
|
|
|
return res, errors.New("uuid不能为空")
|
|
|
|
|
}
|
|
|
|
|
if req.Language == "" {
|
|
|
|
|
res.Msg = msg.ErrorValueAddServiceInfo
|
|
|
|
|
return res, errors.New("语言选项不能为空")
|
|
|
|
|
}
|
|
|
|
|
detail, err := dao.ValueAddServiceDetailByUuidAndLanguage(req.Uuid, req.Language)
|
|
|
|
|
if err != nil {
|
|
|
|
|
res.Msg = msg.ErrorValueAddServiceInfo
|
|
|
|
|
return res, err
|
|
|
|
|
}
|
|
|
|
|
langOptions := []*bundle.ValueAddPriceOptions{}
|
|
|
|
|
if detail.Options != nil && len(detail.Options) > 0 {
|
|
|
|
|
for _, opt := range detail.Options {
|
|
|
|
|
langOptions = append(langOptions, &bundle.ValueAddPriceOptions{
|
|
|
|
|
Id: int64(opt.Id),
|
|
|
|
|
Num: opt.Num,
|
|
|
|
|
Symbol: opt.Symbol,
|
|
|
|
|
Price: fmt.Sprintf("%.2f", opt.Price),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
serviceLang := &bundle.ValueAddServiceLang{
|
|
|
|
|
Uuid: detail.UUID,
|
|
|
|
|
ServiceName: detail.ServiceName,
|
|
|
|
|
ServiceType: detail.ServiceType,
|
|
|
|
|
Language: detail.Language,
|
|
|
|
|
PriceMode: detail.PriceMode,
|
|
|
|
|
OriginalPrice: fmt.Sprintf("%.2f", detail.OriginalPrice),
|
|
|
|
|
Unit: detail.Unit,
|
|
|
|
|
PriceType: int64(detail.PriceType),
|
|
|
|
|
Options: langOptions,
|
|
|
|
|
CreatedAt: time.Unix(detail.CreatedAt, 0).Format("2006-01-02 15:04:05"),
|
|
|
|
|
UpdatedAt: time.Unix(detail.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.ValueAddServiceLang = serviceLang
|
|
|
|
|
res.Msg = msg.SuccessValueAddServiceInfo
|
|
|
|
|
return
|
|
|
|
|
}
|