verify.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { RuleItem } from '@/common/setup/warehouse_receipt_trade/interface';
  2. import { getGoodsById, getQuoteDayInfoByCode } from '@/services/bus/goods';
  3. import { getRules } from '@/services/bus/rules';
  4. import { RuleObject } from "ant-design-vue/lib/form/interface";
  5. // 验证 挂牌数量
  6. /**
  7. *
  8. * @param delistingQty 起摘数量
  9. * @param 挂牌数量对应的key
  10. * @param minivalue 最小单位
  11. * @param maxValue 最大数量(可选)
  12. * @returns
  13. */
  14. export const useVerifyListingNum = <T extends object, k extends keyof T>(formState: T, key: k, minivalue: number, maxValue?: number) => {
  15. const v_num = async (rule: RuleObject, value: number) => {
  16. if (value) {
  17. if (formState[key] && value < (formState[key] as unknown as number)) {
  18. return Promise.reject(`挂牌数量不能小于起摘数量`)
  19. }
  20. if (value < minivalue) {
  21. return Promise.reject(`挂牌数量不能小于${minivalue}`)
  22. }
  23. if (maxValue && value > maxValue) {
  24. return Promise.reject(`挂牌数量不能大于${maxValue}`)
  25. }
  26. if (value % minivalue) {
  27. return Promise.reject(`挂牌数量不是${minivalue}的倍数`)
  28. }
  29. return Promise.resolve();
  30. } else {
  31. return Promise.reject('请输入挂牌数量')
  32. }
  33. };
  34. return { v_num }
  35. }
  36. /**
  37. * 验证 挂牌基差
  38. * @param formState 表单状态
  39. * @param key 商品ID对应的key
  40. * @returns
  41. */
  42. export const useVerifyListingBasis = <T, k extends keyof T>(formState: T, key: k) => {
  43. const v_basis = async (rule: RuleObject, value: number) => {
  44. if (formState[key]) {
  45. if (typeof value === 'number') {
  46. const goodsCode = getGoodsById(formState[key] as unknown as number)?.goodscode as string;
  47. const quote = getQuoteDayInfoByCode(goodsCode);
  48. if (quote) {
  49. const { basisdownratio, basisupratio } = getRules()[0];
  50. // 最小值 = 基差下限百分比 * 昨日收盘价 * -1
  51. const minValue = (basisdownratio * quote.presettle * -1).toFixed(2);
  52. // 最大值 = 基差上限百分比 * 昨日收盘价
  53. const maxValue = (basisupratio * quote.presettle).toFixed(2);
  54. if (value >= Number(minValue) && value <= Number(maxValue)) {
  55. return Promise.resolve();
  56. } else {
  57. if (value < Number(minValue)) {
  58. return Promise.reject(`基差不能小于${minValue}`);
  59. }
  60. if (value > Number(maxValue)) {
  61. return Promise.reject(`基差不能大于${maxValue}`);
  62. }
  63. }
  64. }
  65. return Promise.reject('合约不存在');
  66. } else {
  67. return Promise.reject('请输入基差');
  68. }
  69. } else {
  70. return Promise.reject('请选择合约');
  71. }
  72. };
  73. return { v_basis }
  74. }
  75. /**
  76. * 验证 起摘数量
  77. * @param minValue 最小变动值
  78. */
  79. export const useVerifyBeginDelistingNum = (minValue: number) => {
  80. const v_beginDelistingNum = async (rule: RuleObject, value: number) => {
  81. if (value) {
  82. if (minValue) {
  83. if (value % minValue !== 0) {
  84. return Promise.reject(`起摘数量不是${minValue}的倍数`);
  85. }
  86. }
  87. return Promise.resolve();
  88. } else {
  89. return Promise.reject('请输入起摘数量');
  90. }
  91. }
  92. const v_beginDelistingRules: RuleItem[] = [{ required: true, validator: v_beginDelistingNum, trigger: 'blur', type: 'number', }]
  93. return { v_beginDelistingNum, v_beginDelistingRules }
  94. }