浏览代码

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt
master
CANCERYS\kw093 3 个月前
父节点
当前提交
ecf52a61b7
共有 13 个文件被更改,包括 139 次插入27 次删除
  1. +5
    -5
      src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt
  2. +30
    -0
      src/main/java/com/ffii/fpsms/modules/common/scheduler/web/SchedulerController.kt
  3. +8
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderRepository.kt
  4. +1
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/enums/DeliveryOrderEnum.kt
  5. +22
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt
  6. +25
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt
  7. +1
    -1
      src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt
  8. +2
    -1
      src/main/java/com/ffii/fpsms/modules/master/entity/ProductionScheduleLineRepository.kt
  9. +36
    -14
      src/main/java/com/ffii/fpsms/modules/master/entity/ProductionScheduleRepository.kt
  10. +1
    -0
      src/main/java/com/ffii/fpsms/modules/master/entity/projections/ProdScheduleInfo.kt
  11. +3
    -3
      src/main/java/com/ffii/fpsms/modules/master/service/ProductionScheduleService.kt
  12. +1
    -1
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt
  13. +4
    -0
      src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt

+ 5
- 5
src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt 查看文件

@@ -64,11 +64,11 @@ class M18TestController (
return schedulerService.getM18Pos(); return schedulerService.getM18Pos();
} }
// --------------------------------------------- Scheduler --------------------------------------------- /// // --------------------------------------------- Scheduler --------------------------------------------- ///
@GetMapping("/schedule/po") //
fun schedulePo(@RequestParam @Valid newCron: String) {
settingsService.update(SettingNames.SCHEDULE_M18_PO, newCron);
schedulerService.scheduleM18PoTask()
}
// @GetMapping("/schedule/po")
// fun schedulePo(@RequestParam @Valid newCron: String) {
// settingsService.update(SettingNames.SCHEDULE_M18_PO, newCron);
// schedulerService.scheduleM18PoTask()
// }


// --------------------------------------------- Master Data --------------------------------------------- /// // --------------------------------------------- Master Data --------------------------------------------- ///
@GetMapping("/all") @GetMapping("/all")


+ 30
- 0
src/main/java/com/ffii/fpsms/modules/common/scheduler/web/SchedulerController.kt 查看文件

@@ -0,0 +1,30 @@
package com.ffii.fpsms.modules.common.scheduler.web

import com.ffii.fpsms.modules.common.SettingNames
import com.ffii.fpsms.modules.common.scheduler.service.SchedulerService
import com.ffii.fpsms.modules.settings.service.SettingsService
import jakarta.validation.Valid
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/scheduler")
class SchedulerController(
val schedulerService: SchedulerService,
val settingsService: SettingsService
) {
@GetMapping("/testDetailedProd")
fun testDetailedProd(): Any {
schedulerService.getDetailedProdSchedule()
return 200
}

// Cron Settings
@GetMapping("/updateSetting/poCron")
fun schedulePo(@RequestParam @Valid newCron: String) {
settingsService.update(SettingNames.SCHEDULE_M18_PO, newCron);
schedulerService.scheduleM18PoTask()
}
}

+ 8
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DeliveryOrderRepository.kt 查看文件

@@ -2,10 +2,12 @@ package com.ffii.fpsms.modules.deliveryOrder.entity


import com.ffii.core.support.AbstractRepository import com.ffii.core.support.AbstractRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.models.DeliveryOrderInfo import com.ffii.fpsms.modules.deliveryOrder.entity.models.DeliveryOrderInfo
import com.ffii.fpsms.modules.deliveryOrder.enums.DeliveryOrderStatus
import com.ffii.fpsms.modules.master.entity.projections.SearchId import com.ffii.fpsms.modules.master.entity.projections.SearchId
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import java.io.Serializable import java.io.Serializable
import java.time.LocalDateTime


@Repository @Repository
interface DeliveryOrderRepository : AbstractRepository<DeliveryOrder, Long> { interface DeliveryOrderRepository : AbstractRepository<DeliveryOrder, Long> {
@@ -17,9 +19,15 @@ interface DeliveryOrderRepository : AbstractRepository<DeliveryOrder, Long> {


fun findAllByCodeAndDeletedIsFalse(code: String): List<DeliveryOrderInfo> fun findAllByCodeAndDeletedIsFalse(code: String): List<DeliveryOrderInfo>


fun findAllByShopNameAndDeletedIsFalse(shopName: String): List<DeliveryOrderInfo>


fun findAllByStatusAndDeletedIsFalse(status: DeliveryOrderStatus): List<DeliveryOrderInfo>


fun findByOrderDateBetweenAndDeletedIsFalse(start: LocalDateTime?, end: LocalDateTime?) : List<DeliveryOrderInfo>


fun findAllByCodeContainsAndShopNameContainsAndStatusAndOrderDateBetween(code: String?, shopName: String?, status: DeliveryOrderStatus?, startDate: LocalDateTime?, endDate: LocalDateTime?) : List<DeliveryOrderInfo>


fun findAllByCodeContainsAndShopNameContainsAndStatus(code: String?, shopName: String?, status: DeliveryOrderStatus?): List<DeliveryOrderInfo>;


fun findAllBy() : List<DeliveryOrderInfo>;
} }

+ 1
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/enums/DeliveryOrderEnum.kt 查看文件

@@ -3,5 +3,5 @@ package com.ffii.fpsms.modules.deliveryOrder.enums
enum class DeliveryOrderStatus(val value: String) { enum class DeliveryOrderStatus(val value: String) {
PENDING("pending"), PENDING("pending"),
RECEIVING("receiving"), RECEIVING("receiving"),
COMPLETED("completed");
COMPLETED("completed"),
} }

+ 22
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt 查看文件

@@ -28,6 +28,8 @@ import com.ffii.fpsms.modules.pickOrder.service.PickOrderService
import java.time.LocalDate import java.time.LocalDate
import java.math.BigDecimal import java.math.BigDecimal
import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.master.web.models.MessageResponse
import java.time.LocalDateTime

@Service @Service
open class DeliveryOrderService( open class DeliveryOrderService(
private val deliveryOrderRepository: DeliveryOrderRepository, private val deliveryOrderRepository: DeliveryOrderRepository,
@@ -82,6 +84,26 @@ open class DeliveryOrderService(
return deliveryOrderRepository.findAllByCodeAndDeletedIsFalse(code); return deliveryOrderRepository.findAllByCodeAndDeletedIsFalse(code);
} }


open fun searchByShopName(shopName: String) : List<DeliveryOrderInfo> {
return deliveryOrderRepository.findAllByShopNameAndDeletedIsFalse(shopName);
}

open fun searchByStatus(status: DeliveryOrderStatus): List<DeliveryOrderInfo> {
return deliveryOrderRepository.findAllByStatusAndDeletedIsFalse(status);
}

open fun searchBetweenOrderDate(start: LocalDateTime?, end: LocalDateTime?): List<DeliveryOrderInfo> {
return deliveryOrderRepository.findByOrderDateBetweenAndDeletedIsFalse(start, end);
}

open fun searchDO(code: String?, shopName: String?, status: DeliveryOrderStatus?, startDate: LocalDateTime?, endDate: LocalDateTime?):List<DeliveryOrderInfo> {
if(status == null || startDate == null || endDate ==null){
return deliveryOrderRepository.findAllBy();
}
return deliveryOrderRepository.findAllByCodeContainsAndShopNameContainsAndStatusAndOrderDateBetween(code, shopName, status, startDate, endDate);
}




open fun updateDeliveryOrderStatus(request: SaveDeliveryOrderStatusRequest): SaveDeliveryOrderResponse { open fun updateDeliveryOrderStatus(request: SaveDeliveryOrderStatusRequest): SaveDeliveryOrderResponse {
val deliveryOrder = checkNotNull( val deliveryOrder = checkNotNull(


+ 25
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt 查看文件

@@ -18,6 +18,8 @@ import com.ffii.fpsms.modules.deliveryOrder.web.models.DoDetailResponse
import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest
import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.master.web.models.MessageResponse
import jakarta.validation.Valid import jakarta.validation.Valid
import java.time.LocalDateTime

@RequestMapping("/do") @RequestMapping("/do")
@RestController @RestController
class DeliveryOrderController( class DeliveryOrderController(
@@ -34,10 +36,32 @@ class DeliveryOrderController(
} }


@GetMapping("/search-code/{code}") @GetMapping("/search-code/{code}")
fun searchByCode(@PathVariable code: String): List<DeliveryOrderInfo>{
fun searchByCode(@PathVariable code: String): List<DeliveryOrderInfo> {
return deliveryOrderService.searchByCode(code); return deliveryOrderService.searchByCode(code);
} }


@GetMapping("/search-shopname/{shopName}")
fun searchByShopName(@PathVariable shopName: String): List<DeliveryOrderInfo> {
return deliveryOrderService.searchByShopName(shopName);
}

@GetMapping("/search-status/{status}")
fun searchByStatus(@PathVariable status: DeliveryOrderStatus): List<DeliveryOrderInfo> {
return deliveryOrderService.searchByStatus(status);
}

@GetMapping("/search-orderdate/{start}&{end}")
fun searchBetweenOrderDate(@PathVariable start: LocalDateTime?,@PathVariable end: LocalDateTime?): List<DeliveryOrderInfo> {
return deliveryOrderService.searchBetweenOrderDate(start, end);
}

@GetMapping("/search-DO/{code}&{shopName}&{status}&{startDate}&{endDate}")
fun searchDO(@PathVariable code: String?, @PathVariable shopName: String?, @PathVariable status: DeliveryOrderStatus?, @PathVariable startDate: LocalDateTime? , @PathVariable endDate: LocalDateTime?): List<DeliveryOrderInfo>{
return deliveryOrderService.searchDO(code, shopName, status, startDate, endDate);
}



@PostMapping("/update-status") @PostMapping("/update-status")
fun updateDoStatus(@RequestBody request: SaveDeliveryOrderStatusRequest): SaveDeliveryOrderResponse { fun updateDoStatus(@RequestBody request: SaveDeliveryOrderStatusRequest): SaveDeliveryOrderResponse {
return deliveryOrderService.updateDeliveryOrderStatus(request); return deliveryOrderService.updateDeliveryOrderStatus(request);


+ 1
- 1
src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt 查看文件

@@ -24,7 +24,7 @@ open class JobOrderBomMaterialService(
open fun createJobOrderBomMaterialRequests(joId: Long): List<CreateJobOrderBomMaterialRequest> { open fun createJobOrderBomMaterialRequests(joId: Long): List<CreateJobOrderBomMaterialRequest> {
val zero = BigDecimal.ZERO val zero = BigDecimal.ZERO
val jo = jobOrderRepository.findById(joId).getOrNull() ?: throw NoSuchElementException() val jo = jobOrderRepository.findById(joId).getOrNull() ?: throw NoSuchElementException()
val proportion = (jo.reqQty ?: zero).divide(jo.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val proportion = BigDecimal.ONE //(jo.reqQty ?: zero).divide(jo.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)


val jobmRequests = jo.bom?.bomMaterials?.map { bm -> val jobmRequests = jo.bom?.bomMaterials?.map { bm ->
val salesUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) } val salesUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) }


+ 2
- 1
src/main/java/com/ffii/fpsms/modules/master/entity/ProductionScheduleLineRepository.kt 查看文件

@@ -14,7 +14,8 @@ interface ProductionScheduleLineRepository : AbstractRepository<ProductionSchedu
with prod_prop as ( with prod_prop as (
select select
psl.id as pslId, psl.id as pslId,
round(coalesce(psl.prodQty, 0) / coalesce(b.outputQty, 1), 5) as proportion
-- round(coalesce(psl.prodQty, 0) / coalesce(b.outputQty, 1), 5) as proportion
1 as proportion
from production_schedule_line psl from production_schedule_line psl
left join bom b on b.itemId = psl.itemId left join bom b on b.itemId = psl.itemId
where psl.id = :id and b.id is not null where psl.id = :id and b.id is not null


+ 36
- 14
src/main/java/com/ffii/fpsms/modules/master/entity/ProductionScheduleRepository.kt 查看文件

@@ -36,9 +36,17 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule,
ps.totalFGType, ps.totalFGType,
ps.`type` ps.`type`
from production_schedule ps from production_schedule ps
),
ranked_prod as (
select
*,
row_number() over (partition by date(schedulePeriod) and date(schedulePeriodTo) order by scheduleAt desc) as rn
from prod
where deleted = false
) )
select * from prod
select * from ranked_prod
where deleted = false where deleted = false
and rn = 1
and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0)
and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0)
and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0)
@@ -59,9 +67,17 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule,
ps.totalFGType, ps.totalFGType,
ps.`type` ps.`type`
from production_schedule ps from production_schedule ps
),
ranked_prod as (
select
*,
row_number() over (partition by date(schedulePeriod) and date(schedulePeriodTo) order by scheduleAt desc) as rn
from prod
where deleted = false
) )
select count(*) from prod
select count(*) from ranked_prod
where deleted = false where deleted = false
and rn = 1
and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0)
and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0) and (:schedulePeriod = '' or datediff(schedulePeriod, coalesce(:schedulePeriod, schedulePeriod)) = 0)
and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0) and (:schedulePeriodTo = '' or datediff(schedulePeriodTo, coalesce(:schedulePeriodTo, schedulePeriodTo)) = 0)
@@ -84,16 +100,21 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule,
nativeQuery = true, nativeQuery = true,
value = value =
""" """
select
ps.id,
ps.deleted,
ps.scheduleAt,
ps.produceAt,
ps.totalEstProdCount,
ps.totalFGType,
ps.`type`
from production_schedule ps
where deleted = false
select *
from (
select
ps.id,
ps.deleted,
ps.scheduleAt,
ps.produceAt,
ps.totalEstProdCount,
ps.totalFGType,
ps.`type`,
row_number() over (partition by date(ps.produceAt) order by ps.scheduleAt desc) as rn
from production_schedule ps
where deleted = false
) ranked_prod
where rn = 1
and produceAt is not null and produceAt is not null
and scheduleAt in (select max(ps2.scheduleAt) from production_schedule ps2 group by ps2.produceAt) and scheduleAt in (select max(ps2.scheduleAt) from production_schedule ps2 group by ps2.produceAt)
-- and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0) -- and (:scheduleAt = '' or datediff(scheduleAt, coalesce(:scheduleAt, scheduleAt)) = 0)
@@ -117,7 +138,8 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule,
with prod_prop as ( with prod_prop as (
select select
psl.id as pslId, psl.id as pslId,
round(coalesce(psl.prodQty, 0) / coalesce(b.outputQty, 1), 5) as proportion
-- round(coalesce(psl.prodQty, 0) / coalesce(b.outputQty, 1), 5) as proportion
1 as proportion
from production_schedule ps from production_schedule ps
left join production_schedule_line psl on psl.prodScheduleId = ps.id left join production_schedule_line psl on psl.prodScheduleId = ps.id
left join bom b on b.itemId = psl.itemId left join bom b on b.itemId = psl.itemId
@@ -214,7 +236,7 @@ interface ProductionScheduleRepository : AbstractRepository<ProductionSchedule,
where psl.deleted is false and pe.prodTimeInMinute is not null and pm.bomMaterials is not null where psl.deleted is false and pe.prodTimeInMinute is not null and pm.bomMaterials is not null
and ps.id = :id and ps.id = :id
group by psl.id, jo.id, pp.proportion, pm.bomOutputQty, uc.udfudesc group by psl.id, jo.id, pp.proportion, pm.bomOutputQty, uc.udfudesc
) prod group by prod.id limit 1
) prod group by prod.id limit 1;
""" """
) )
fun findDetailedProdScheduleWithLine(id: Long): DetailedProdScheduleWithLineWithJsonString? fun findDetailedProdScheduleWithLine(id: Long): DetailedProdScheduleWithLineWithJsonString?

+ 1
- 0
src/main/java/com/ffii/fpsms/modules/master/entity/projections/ProdScheduleInfo.kt 查看文件

@@ -8,6 +8,7 @@ import java.time.LocalDateTime
interface ProdScheduleInfo { interface ProdScheduleInfo {
val id: Long? val id: Long?
val scheduleAt: LocalDate? val scheduleAt: LocalDate?
val produceAt: LocalDate?
val schedulePeriod: LocalDate? val schedulePeriod: LocalDate?
val schedulePeriodTo: LocalDate? val schedulePeriodTo: LocalDate?
val totalEstProdCount: BigDecimal? val totalEstProdCount: BigDecimal?


+ 3
- 3
src/main/java/com/ffii/fpsms/modules/master/service/ProductionScheduleService.kt 查看文件

@@ -143,7 +143,7 @@ open class ProductionScheduleService(
// BigDecimal.ONE // BigDecimal.ONE
// } // }


val proportion = BigDecimal(line.prodQty).divide(bm.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val proportion = BigDecimal.ONE // BigDecimal(line.prodQty).divide(bm.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val demandQty = bm.qty?.times(proportion) ?: zero val demandQty = bm.qty?.times(proportion) ?: zero
val saleUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) } val saleUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) }


@@ -230,7 +230,7 @@ open class ProductionScheduleService(
// BigDecimal.ONE // BigDecimal.ONE
// } // }


val proportion = BigDecimal(line.prodQty).divide(bm.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val proportion = BigDecimal.ONE //BigDecimal(line.prodQty).divide(bm.bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val demandQty = bm.qty?.times(proportion) ?: zero val demandQty = bm.qty?.times(proportion) ?: zero
val saleUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) } val saleUnit = bm.item?.id?.let { itemUomService.findSalesUnitByItemId(it) }


@@ -363,7 +363,7 @@ open class ProductionScheduleService(
val prodScheduleLine = request.id.let { productionScheduleLineRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() val prodScheduleLine = request.id.let { productionScheduleLineRepository.findById(it).getOrNull() } ?: throw NoSuchElementException()
val bom = prodScheduleLine.item.id?.let { bomService.findByItemId(it) } val bom = prodScheduleLine.item.id?.let { bomService.findByItemId(it) }
val approver = SecurityUtils.getUser().getOrNull() val approver = SecurityUtils.getUser().getOrNull()
val proportion = request.demandQty.divide(bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val proportion = BigDecimal.ONE // request.demandQty.divide(bom?.outputQty ?: BigDecimal.ONE, 5, RoundingMode.HALF_UP)
val isSameQty = request.demandQty.equals(prodScheduleLine.prodQty) val isSameQty = request.demandQty.equals(prodScheduleLine.prodQty)


// Update Prod Schedule Type // Update Prod Schedule Type


+ 1
- 1
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt 查看文件

@@ -441,7 +441,7 @@ open class PickOrderService(
val salesUnit = inventoryLotLine?.inventoryLot?.item?.id?.let { _itemId -> val salesUnit = inventoryLotLine?.inventoryLot?.item?.id?.let { _itemId ->
itemUomService.findSalesUnitByItemId(_itemId) itemUomService.findSalesUnitByItemId(_itemId)
} }
val ratio = BigDecimal.ONE
val ratio = BigDecimal.ONE //(salesUnit?.ratioN ?: zero).divide(salesUnit?.ratioD ?: one)


val remainingQty = (inventoryLotLine?.inQty ?: zero) val remainingQty = (inventoryLotLine?.inQty ?: zero)
.minus(inventoryLotLine?.outQty ?: zero) .minus(inventoryLotLine?.outQty ?: zero)


+ 4
- 0
src/main/java/com/ffii/fpsms/modules/stock/entity/projection/StockInLineInfo.kt 查看文件

@@ -65,4 +65,8 @@ interface PutAwayLineForSil {
val warehouseCode: String?; val warehouseCode: String?;
@get:Value("#{target.warehouse?.name}") @get:Value("#{target.warehouse?.name}")
val warehouseName: String?; val warehouseName: String?;
@get:Value("#{target.created}")
val putawayDate: LocalDateTime?;
@get:Value("#{target.createdBy}")
val putawayUser: String?;
} }

正在加载...
取消
保存