日期校验有问题
This commit is contained in:
@@ -11,25 +11,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CostItem struct {
|
type CostItem struct {
|
||||||
Cost int `json:"cost"` // 必须,非负
|
Cost int `json:"cost"` // 费用
|
||||||
CostT int `json:"costt"` // 必须,非负
|
CostT int `json:"costt"` // 总价
|
||||||
CurrencyType string `json:"currencytype"` // 必须
|
CurrencyType string `json:"currencytype"` // 货币类型
|
||||||
Int int `json:"int"` // 必须
|
Int int `json:"int"` // 数量
|
||||||
Type string `json:"type"` // 必须
|
Type string `json:"type"` // 费用类型
|
||||||
}
|
}
|
||||||
type From_purchase_addorder struct {
|
type From_purchase_addorder struct {
|
||||||
Costs []CostItem `json:"costs"` // 价格
|
Costs []CostItem `json:"costs"` // 成本
|
||||||
ExpressNumber string //快递单号
|
Link string `json:"link"` // 链接
|
||||||
Link string `json:"link"` // 可选
|
OrderStatus string `json:"order_status"` // 订单状态
|
||||||
Notes string //样式
|
PartName string `json:"partname"` // 物件名称
|
||||||
OrderStatus string `json:"order_status"` //
|
Photos []string `json:"photos"` // 图片备注
|
||||||
PartName string `json:"partname"` // 可选
|
Remark string `json:"remark"` // 备注
|
||||||
Photos []string `json:"photos"` // 可选
|
Styles string `json:"styles"` // 样式备注
|
||||||
Remark string `json:"remark"` // 可选
|
Title string `json:"title"` // 标题
|
||||||
Styles string `json:"styles"` // 可选
|
TrackingNumber string `json:"tracking_number"` // 快递单号
|
||||||
Title string `json:"title"` // 必须
|
UpdateTime string `json:"update_time"` // 更新时间
|
||||||
TrackingNumber string `json:"tracking_number"` // 可选
|
|
||||||
UpdateTime string `json:"update_time"` // 可选
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApiPurchase(r *gin.RouterGroup) {
|
func ApiPurchase(r *gin.RouterGroup) {
|
||||||
@@ -99,7 +97,8 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
var jsondata From_purchase_addorder
|
var jsondata From_purchase_addorder
|
||||||
if err := mapstructure.Decode(data, &jsondata); err == nil {
|
if err := mapstructure.Decode(data, &jsondata); err == nil {
|
||||||
|
|
||||||
//fmt.Println("转换后数据:\n", jsondata)
|
jsonStr, _ := json.MarshalIndent(jsondata, "", " ")
|
||||||
|
fmt.Println("转换后数据:\n", string(jsonStr))
|
||||||
|
|
||||||
//数据比较混乱 在这里校验
|
//数据比较混乱 在这里校验
|
||||||
|
|
||||||
@@ -107,15 +106,19 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
is_data_ok := true
|
is_data_ok := true
|
||||||
if jsondata.Title == "" {
|
if jsondata.Title == "" {
|
||||||
is_data_ok = false
|
is_data_ok = false
|
||||||
|
|
||||||
|
fmt.Println("err1")
|
||||||
}
|
}
|
||||||
|
|
||||||
//判断数量与价格是否为负数
|
//判断数量与价格是否为负数
|
||||||
for i := 0; i < len(jsondata.Costs); i++ {
|
for i := 0; i < len(jsondata.Costs); i++ {
|
||||||
if jsondata.Costs[i].Cost <= 0 {
|
if jsondata.Costs[i].Cost <= 0 {
|
||||||
is_data_ok = false
|
is_data_ok = false
|
||||||
|
fmt.Println("err2")
|
||||||
}
|
}
|
||||||
if jsondata.Costs[i].Int <= 0 {
|
if jsondata.Costs[i].Int <= 0 {
|
||||||
is_data_ok = false
|
is_data_ok = false
|
||||||
|
fmt.Println("err3")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,6 +127,7 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
//判断字符串是否包含标点符号
|
//判断字符串是否包含标点符号
|
||||||
if models.IsContainsSpecialChar(jsondata.Photos[i]) {
|
if models.IsContainsSpecialChar(jsondata.Photos[i]) {
|
||||||
is_data_ok = false
|
is_data_ok = false
|
||||||
|
fmt.Println("err4")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -132,6 +136,7 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
uptime, e := models.StringToTimePtr(jsondata.UpdateTime)
|
uptime, e := models.StringToTimePtr(jsondata.UpdateTime)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
is_data_ok = false
|
is_data_ok = false
|
||||||
|
fmt.Println("err5")
|
||||||
}
|
}
|
||||||
|
|
||||||
if is_data_ok {
|
if is_data_ok {
|
||||||
@@ -164,7 +169,7 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ReturnJson(ctx, "jsonErr", nil)
|
ReturnJson(ctx, "jsonErr_1", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -175,7 +180,7 @@ func ApiPurchase(r *gin.RouterGroup) {
|
|||||||
ReturnJson(ctx, "userCookieError", nil)
|
ReturnJson(ctx, "userCookieError", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnJson(ctx, "apiErr", nil)
|
//ReturnJson(ctx, "apiErr", nil)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,18 @@
|
|||||||
"usedAt": 1775242179615,
|
"usedAt": 1775242179615,
|
||||||
"industryId": "all"
|
"industryId": "all"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"8e3dae3f55ad43b4b3b604818204bc8c": [
|
||||||
|
{
|
||||||
|
"expertId": "FrontendDeveloper",
|
||||||
|
"name": "Paul",
|
||||||
|
"profession": "前端开发工程师",
|
||||||
|
"avatarUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/avatars/02-Engineering/FrontendDeveloper/FrontendDeveloper.png",
|
||||||
|
"promptUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/experts/02-Engineering/FrontendDeveloper/FrontendDeveloper_zh.md",
|
||||||
|
"usedAt": 1775314940465,
|
||||||
|
"industryId": "all"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lastUpdated": 1775242274077
|
"lastUpdated": 1775314975133
|
||||||
}
|
}
|
||||||
@@ -14,3 +14,9 @@
|
|||||||
- 删除按钮、修改日程提交按钮
|
- 删除按钮、修改日程提交按钮
|
||||||
- `copyEvent` 和 `pastEvent` 的 toast 提示
|
- `copyEvent` 和 `pastEvent` 的 toast 提示
|
||||||
- `"xxx的日程"` 占位文本暂保留(后续待动态注入用户名时再处理)
|
- `"xxx的日程"` 占位文本暂保留(后续待动态注入用户名时再处理)
|
||||||
|
|
||||||
|
## purchase/addorder 表单字段对齐后端
|
||||||
|
|
||||||
|
- 修正 `src/views/purchase/addorder.vue` 提交 payload 字段名,使其与后端 `From_purchase_addorder` 一致:`partname`、`styles`、`tracking_number`、`update_time`。
|
||||||
|
- 同步修正对应表单控件绑定,避免物件名称、样式备注、更新时间、快递单号提交到错误字段。
|
||||||
|
|
||||||
|
|||||||
@@ -37,24 +37,24 @@ const orderStatus = computed(() => ({
|
|||||||
|
|
||||||
const costEntries = reactive([])
|
const costEntries = reactive([])
|
||||||
const newCost = reactive({
|
const newCost = reactive({
|
||||||
type: '1', qty: 1, cost: 0, currencyType: '1',
|
type: '1', int: 1, cost: 0, currencyType: '1',
|
||||||
})
|
})
|
||||||
|
|
||||||
const newCostTotal = computed(() =>
|
const newCostTotal = computed(() =>
|
||||||
parseFloat((newCost.qty * newCost.cost).toFixed(2))
|
parseFloat((newCost.int * newCost.cost).toFixed(2))
|
||||||
)
|
)
|
||||||
|
|
||||||
function addCostEntry() {
|
function addCostEntry() {
|
||||||
if (newCost.cost <= 0) return
|
if (newCost.cost <= 0) return
|
||||||
costEntries.push({
|
costEntries.push({
|
||||||
type: newCost.type,
|
type: newCost.type,
|
||||||
qty: newCost.qty,
|
int: newCost.int,
|
||||||
cost: newCost.cost,
|
cost: newCost.cost,
|
||||||
cost_t: newCostTotal.value,
|
costt: newCostTotal.value,
|
||||||
currency_type: newCost.currencyType,
|
currencytype: newCost.currencyType,
|
||||||
})
|
})
|
||||||
newCost.type = '1'
|
newCost.type = '1'
|
||||||
newCost.qty = 1
|
newCost.int = 1
|
||||||
newCost.cost = 0
|
newCost.cost = 0
|
||||||
newCost.currencyType = '1'
|
newCost.currencyType = '1'
|
||||||
}
|
}
|
||||||
@@ -73,11 +73,11 @@ const form = reactive({
|
|||||||
remark: '',
|
remark: '',
|
||||||
photos: [],
|
photos: [],
|
||||||
link: '',
|
link: '',
|
||||||
style_remarks: '',
|
partname: '',
|
||||||
notes: '',
|
styles: '',
|
||||||
costs: [],
|
costs: [],
|
||||||
tracking_number: '',
|
tracking_number: '',
|
||||||
express_number: '',
|
updatetime: '',
|
||||||
order_status: '1',
|
order_status: '1',
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ async function handleSubmit() {
|
|||||||
form.costs = costEntries.map(h => ({
|
form.costs = costEntries.map(h => ({
|
||||||
...h,
|
...h,
|
||||||
cost: Math.round(h.cost * 100),
|
cost: Math.round(h.cost * 100),
|
||||||
cost_t: Math.round(h.cost_t * 100),
|
costt: Math.round(h.costt * 100),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
loading.value = true
|
loading.value = true
|
||||||
@@ -172,7 +172,7 @@ async function handleSubmit() {
|
|||||||
<div>
|
<div>
|
||||||
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.part_name') }}</label>
|
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.part_name') }}</label>
|
||||||
<input
|
<input
|
||||||
v-model="form.style_remarks"
|
v-model="form.partname"
|
||||||
type="text"
|
type="text"
|
||||||
class="w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2 text-sm outline-none transition-colors focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 dark:border-dk-muted dark:bg-dk-base dark:text-white"
|
class="w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2 text-sm outline-none transition-colors focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 dark:border-dk-muted dark:bg-dk-base dark:text-white"
|
||||||
:placeholder="t('purchase_addorder.part_name')"
|
:placeholder="t('purchase_addorder.part_name')"
|
||||||
@@ -180,7 +180,7 @@ async function handleSubmit() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.style_remarks') }}</label>
|
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.style_remarks') }}</label>
|
||||||
<tagadder :placeholder="t('purchase_addorder.add_style')" v-model="form.notes" />
|
<tagadder :placeholder="t('purchase_addorder.add_style')" v-model="form.styles" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- costs table -->
|
<!-- costs table -->
|
||||||
@@ -201,9 +201,9 @@ async function handleSubmit() {
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="(item, idx) in costEntries" :key="idx" class="border-b border-gray-100 dark:border-dk-muted">
|
<tr v-for="(item, idx) in costEntries" :key="idx" class="border-b border-gray-100 dark:border-dk-muted">
|
||||||
<td class="px-3 py-2 font-medium text-gray-900 dark:text-white">{{ costType[item.type] }}</td>
|
<td class="px-3 py-2 font-medium text-gray-900 dark:text-white">{{ costType[item.type] }}</td>
|
||||||
<td class="px-3 py-2 text-gray-500">{{ item.qty }}</td>
|
<td class="px-3 py-2 text-gray-500">{{ item.int }}</td>
|
||||||
<td class="px-3 py-2 text-gray-500">{{ item.cost }}</td>
|
<td class="px-3 py-2 text-gray-500">{{ item.cost }}</td>
|
||||||
<td class="px-3 py-2 text-gray-500">{{ item.cost_t }}</td>
|
<td class="px-3 py-2 text-gray-500">{{ item.costt }}</td>
|
||||||
<td class="px-3 py-2 text-gray-500">{{ currencyOptions[item.currency_type] }}</td>
|
<td class="px-3 py-2 text-gray-500">{{ currencyOptions[item.currency_type] }}</td>
|
||||||
<td class="px-3 py-2">
|
<td class="px-3 py-2">
|
||||||
<button class="rounded px-2 py-1 text-xs font-medium text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20" @click="removeCostEntry(idx)">{{ t('purchase_addorder.remove') }}</button>
|
<button class="rounded px-2 py-1 text-xs font-medium text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20" @click="removeCostEntry(idx)">{{ t('purchase_addorder.remove') }}</button>
|
||||||
@@ -224,7 +224,7 @@ async function handleSubmit() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="mb-1 block text-xs font-medium text-gray-500">{{ t('purchase_addorder.input_quantity') }}</label>
|
<label class="mb-1 block text-xs font-medium text-gray-500">{{ t('purchase_addorder.input_quantity') }}</label>
|
||||||
<input v-model.number="newCost.qty" type="number" class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm dark:border-dk-muted dark:bg-dk-base dark:text-white" min="1" />
|
<input v-model.number="newCost.int" type="number" class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm dark:border-dk-muted dark:bg-dk-base dark:text-white" min="1" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="mb-1 block text-xs font-medium text-gray-500">{{ t('purchase_addorder.input_fee') }}</label>
|
<label class="mb-1 block text-xs font-medium text-gray-500">{{ t('purchase_addorder.input_fee') }}</label>
|
||||||
@@ -255,12 +255,12 @@ async function handleSubmit() {
|
|||||||
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">
|
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">
|
||||||
{{ t('purchase_addorder.update_time') }} <span class="text-red-500">*</span>
|
{{ t('purchase_addorder.update_time') }} <span class="text-red-500">*</span>
|
||||||
</label>
|
</label>
|
||||||
<datePicker v-model="form.tracking_number" />
|
<datePicker v-model="form.updatetime" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.tracking_number') }}</label>
|
<label class="mb-1.5 block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t('purchase_addorder.tracking_number') }}</label>
|
||||||
<input
|
<input
|
||||||
v-model="form.express_number"
|
v-model="form.tracking_number"
|
||||||
type="text"
|
type="text"
|
||||||
class="w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2 text-sm outline-none transition-colors focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 dark:border-dk-muted dark:bg-dk-base dark:text-white"
|
class="w-full rounded-lg border border-gray-300 bg-white px-3.5 py-2 text-sm outline-none transition-colors focus:border-blue-500 focus:ring-2 focus:ring-blue-500/20 dark:border-dk-muted dark:bg-dk-base dark:text-white"
|
||||||
:placeholder="t('purchase_addorder.input_tracking_number')"
|
:placeholder="t('purchase_addorder.input_tracking_number')"
|
||||||
|
|||||||
Reference in New Issue
Block a user