|
|
@@ -1,5 +1,6 @@
|
|
|
package com.malk.service.workhours;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.malk.server.aliwork.YDConf;
|
|
|
import com.malk.server.aliwork.YDParam;
|
|
|
import com.malk.server.common.McException;
|
|
|
@@ -8,9 +9,11 @@ import com.malk.server.workhours.MonthClosingCheckRequest;
|
|
|
import com.malk.server.workhours.MonthClosingStatusResult;
|
|
|
import com.malk.server.workhours.TimeCardApprovalStartRequest;
|
|
|
import com.malk.server.workhours.TimeCardRepairSubmitRequest;
|
|
|
+import com.malk.server.workhours.TimeCardRepairSummaryUpsertRequest;
|
|
|
import com.malk.server.workhours.WHConf;
|
|
|
import com.malk.service.aliwork.YDClient;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
|
|
|
|
import java.time.YearMonth;
|
|
|
@@ -27,6 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
+import static org.mockito.Mockito.never;
|
|
|
import static org.mockito.Mockito.times;
|
|
|
import static org.mockito.Mockito.verify;
|
|
|
import static org.mockito.Mockito.verifyNoInteractions;
|
|
|
@@ -112,12 +116,93 @@ class TimeCardRepairServiceTest {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- void shouldAllowRepairWhenChangeFullyOffsetsApprovedHours() {
|
|
|
+ void shouldBlockRepairWhenChangeFullyOffsetsApprovedHours() {
|
|
|
Map<String, Object> formData = new HashMap<>();
|
|
|
formData.put("numberField_mmeakgi4", 8d);
|
|
|
formData.put("numberField_mmeakgi5", -8d);
|
|
|
|
|
|
- assertFalse(TimeCardRepairService.hasApprovedOrChangedHours(formData));
|
|
|
+ assertTrue(TimeCardRepairService.hasApprovedOrChangedHours(formData));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void shouldBlockRepairWhenOriginalApprovalStatusIsApproved() {
|
|
|
+ Map<String, Object> formData = new HashMap<>();
|
|
|
+ formData.put("selectField_mre1xz9g", "已审批");
|
|
|
+ assertTrue(TimeCardRepairService.hasApprovedOrChangedHours(formData));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void shouldNotSaveDraftOverApprovedRepairWithCorruptedDraftStatus() {
|
|
|
+ YDClient client = mock(YDClient.class);
|
|
|
+ MonthClosingService closingService = mock(MonthClosingService.class);
|
|
|
+ WHConf conf = new WHConf();
|
|
|
+ conf.setFormUuidWorkHoursSummary("original-summary");
|
|
|
+ conf.setFormUuidRepairWorkHoursSummary("repair-summary");
|
|
|
+ conf.setRepairSummarySyncStatusField("repair-status");
|
|
|
+ when(closingService.isClosed("202608")).thenReturn(true);
|
|
|
+ DDR_New<Object> noOriginal = new DDR_New<>();
|
|
|
+ noOriginal.setData(Collections.emptyList());
|
|
|
+ Map<String, Object> child = new HashMap<>();
|
|
|
+ child.put("numberField_mmeakgii", 8d);
|
|
|
+ Map<String, Object> formData = new HashMap<>();
|
|
|
+ formData.put("repair-status", "暂存");
|
|
|
+ formData.put("textField_mmbffvd9", "user-1");
|
|
|
+ formData.put("textField_mmbffvdb", "20260818");
|
|
|
+ formData.put("tableField_mmeakgid", Collections.singletonList(child));
|
|
|
+ Map<String, Object> record = new HashMap<>();
|
|
|
+ record.put("formData", formData);
|
|
|
+ DDR_New<Object> approvedRepair = new DDR_New<>();
|
|
|
+ approvedRepair.setData(Collections.singletonList(record));
|
|
|
+ when(client.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
|
|
|
+ .thenReturn(noOriginal, approvedRepair);
|
|
|
+ TimeCardRepairService service = new TimeCardRepairService();
|
|
|
+ ReflectionTestUtils.setField(service, "ydClient", client);
|
|
|
+ ReflectionTestUtils.setField(service, "whConf", conf);
|
|
|
+ ReflectionTestUtils.setField(service, "monthClosingService", closingService);
|
|
|
+ TimeCardRepairSummaryUpsertRequest request = new TimeCardRepairSummaryUpsertRequest();
|
|
|
+ request.setSubmitterUserId("user-1");
|
|
|
+ request.setDayText("20260818");
|
|
|
+ request.setFormData(Collections.singletonMap("numberField_mmd1smel", 8d));
|
|
|
+
|
|
|
+ assertThrows(McException.class, () -> service.upsert(request));
|
|
|
+ verify(client, never()).operateData(any(YDParam.class), eq(YDConf.FORM_OPERATION.upsert));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void shouldCalculateRepairDraftTotalsFromRowsInsteadOfPageTotals() {
|
|
|
+ YDClient client = mock(YDClient.class);
|
|
|
+ MonthClosingService closingService = mock(MonthClosingService.class);
|
|
|
+ WHConf conf = new WHConf();
|
|
|
+ conf.setFormUuidWorkHoursSummary("original-summary");
|
|
|
+ conf.setFormUuidRepairWorkHoursSummary("repair-summary");
|
|
|
+ conf.setRepairSummarySyncStatusField("repair-status");
|
|
|
+ when(closingService.isClosed("202608")).thenReturn(true);
|
|
|
+ DDR_New<Object> empty = new DDR_New<>();
|
|
|
+ empty.setData(Collections.emptyList());
|
|
|
+ when(client.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
|
|
|
+ .thenReturn(empty);
|
|
|
+ TimeCardRepairService service = new TimeCardRepairService();
|
|
|
+ ReflectionTestUtils.setField(service, "ydClient", client);
|
|
|
+ ReflectionTestUtils.setField(service, "whConf", conf);
|
|
|
+ ReflectionTestUtils.setField(service, "monthClosingService", closingService);
|
|
|
+ Map<String, Object> child = new HashMap<>();
|
|
|
+ child.put("numberField_mmczo635", 5d);
|
|
|
+ Map<String, Object> payload = new HashMap<>();
|
|
|
+ payload.put("tableField_mmczo634", Collections.singletonList(child));
|
|
|
+ payload.put("numberField_mmeakgi4", 9d);
|
|
|
+ payload.put("numberField_mmd1smel", 99d);
|
|
|
+ TimeCardRepairSummaryUpsertRequest request = new TimeCardRepairSummaryUpsertRequest();
|
|
|
+ request.setSubmitterUserId("user-1");
|
|
|
+ request.setDayText("20260818");
|
|
|
+ request.setFormData(payload);
|
|
|
+
|
|
|
+ assertTrue(service.upsert(request));
|
|
|
+ ArgumentCaptor<YDParam> captor = ArgumentCaptor.forClass(YDParam.class);
|
|
|
+ verify(client).operateData(captor.capture(), eq(YDConf.FORM_OPERATION.upsert));
|
|
|
+ Map<String, Object> written = JSON.parseObject(captor.getValue().getFormDataJson(), Map.class);
|
|
|
+ assertEquals(5d, ((Number) written.get("numberField_mmd1smel")).doubleValue());
|
|
|
+ assertEquals(0d, ((Number) written.get("numberField_mmeakgi4")).doubleValue());
|
|
|
+ assertEquals("暂存", written.get("repair-status"));
|
|
|
}
|
|
|
|
|
|
@Test
|