verify.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. */
  39. export const useVerifyListingBasis = (getFormState: () => { goodsid?: number, marketid?: number }) => {
  40. const v_basis = async (rule: RuleObject, value: number) => {
  41. const { goodsid, marketid } = getFormState();
  42. if (marketid) {
  43. const config = getRules().find((e) => e.marketid === marketid);
  44. if (config) {
  45. if (goodsid) {
  46. const goodsCode = getGoodsById(goodsid)?.goodscode as string;
  47. const quote = getQuoteDayInfoByCode(goodsCode);
  48. if (quote) {
  49. if (typeof value === 'number') {
  50. // 最小值 = 基差下限百分比 * 昨日收盘价 * -1
  51. const minValue = (config.basisdownratio * quote.presettle * -1).toFixed(2);
  52. // 最大值 = 基差上限百分比 * 昨日收盘价
  53. const maxValue = (config.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. }
  67. return Promise.reject('商品盘面不存在');
  68. }
  69. return Promise.reject('请选择合约');
  70. }
  71. return Promise.reject('市场参数未配置');
  72. }
  73. return Promise.reject('请选择交易市场');
  74. };
  75. return { v_basis }
  76. }
  77. /**
  78. * 验证 起摘数量
  79. * @param minValue 最小变动值
  80. */
  81. export const useVerifyBeginDelistingNum = (minValue: number) => {
  82. const v_beginDelistingNum = async (rule: RuleObject, value: number) => {
  83. if (value) {
  84. if (minValue) {
  85. if (value % minValue !== 0) {
  86. return Promise.reject(`起摘数量不是${minValue}的倍数`);
  87. }
  88. }
  89. return Promise.resolve();
  90. } else {
  91. return Promise.reject('请输入起摘数量');
  92. }
  93. }
  94. const v_beginDelistingRules: RuleItem[] = [{ required: true, validator: v_beginDelistingNum, trigger: 'blur', type: 'number', }]
  95. return { v_beginDelistingNum, v_beginDelistingRules }
  96. }