|
|
@ -119,7 +119,32 @@ |
|
|
|
|
|
|
|
|
<FirmReportsForm ref="formRef" @reloadList="queryData"/> |
|
|
<FirmReportsForm ref="formRef" @reloadList="queryData"/> |
|
|
|
|
|
|
|
|
|
|
|
<!-- 缺失季度选择弹窗 --> |
|
|
|
|
|
<a-modal |
|
|
|
|
|
v-model:open="quarterModalVisible" |
|
|
|
|
|
title="检测到未提交的季度数据" |
|
|
|
|
|
:width="420" |
|
|
|
|
|
:maskClosable="false" |
|
|
|
|
|
@ok="handleCreateQuarters" |
|
|
|
|
|
okText="创建选中的季度" |
|
|
|
|
|
cancelText="取消" |
|
|
|
|
|
> |
|
|
|
|
|
<div style="padding: 8px 0;"> |
|
|
|
|
|
<p style="margin-bottom: 10px; color: #333; font-weight: 500;"> |
|
|
|
|
|
提交{{ quarterYear }}年第{{ quarterCurrentQuarter }}季度前,以下季度成本报表尚未提交: |
|
|
|
|
|
</p> |
|
|
|
|
|
<div style="background: #fafafa; border: 1px solid #f0f0f0; padding: 12px; border-radius: 6px; margin-bottom: 10px;"> |
|
|
|
|
|
<div v-for="(q, idx) in quarterMissingList" :key="idx" |
|
|
|
|
|
style="padding: 6px 0; display: flex; align-items: center;" |
|
|
|
|
|
:style="{ borderBottom: idx < quarterMissingList.length - 1 ? '1px dashed #e8e8e8' : 'none' }"> |
|
|
|
|
|
<a-checkbox v-model:checked="q.checked" /> |
|
|
|
|
|
<span style="margin-left: 8px; font-size: 14px;">{{ q.label }}</span> |
|
|
|
|
|
<span style="margin-left: auto; color: #999; font-size: 12px;">空白报表</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<p style="color: #999; font-size: 12px;">勾选需要创建的季度,取消勾选则跳过。创建后请逐季度填写收入后提交。</p> |
|
|
|
|
|
</div> |
|
|
|
|
|
</a-modal> |
|
|
|
|
|
|
|
|
</a-card> |
|
|
</a-card> |
|
|
</template> |
|
|
</template> |
|
|
@ -314,6 +339,46 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ---------------------------- 缺失季度弹窗 ---------------------------- |
|
|
|
|
|
const quarterModalVisible = ref(false); |
|
|
|
|
|
const quarterYear = ref(null); |
|
|
|
|
|
const quarterCurrentQuarter = ref(null); |
|
|
|
|
|
const quarterFirmId = ref(null); |
|
|
|
|
|
const quarterMissingList = ref([]); |
|
|
|
|
|
const pendingSubmitRecord = ref(null); |
|
|
|
|
|
|
|
|
|
|
|
async function handleCreateQuarters() { |
|
|
|
|
|
const checkedItems = quarterMissingList.value.filter(q => q.checked); |
|
|
|
|
|
if (checkedItems.length === 0) { |
|
|
|
|
|
message.warning('请至少勾选一个需要创建的季度'); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
try { |
|
|
|
|
|
SmartLoading.show(); |
|
|
|
|
|
const yearGroups = {}; |
|
|
|
|
|
checkedItems.forEach(q => { |
|
|
|
|
|
if (!yearGroups[q.year]) { |
|
|
|
|
|
yearGroups[q.year] = []; |
|
|
|
|
|
} |
|
|
|
|
|
yearGroups[q.year].push(q.quarterNum); |
|
|
|
|
|
}); |
|
|
|
|
|
for (const [yr, quarters] of Object.entries(yearGroups)) { |
|
|
|
|
|
await firmReportsApi.batchCreateMissing({ |
|
|
|
|
|
firmId: quarterFirmId.value, |
|
|
|
|
|
year: parseInt(yr), |
|
|
|
|
|
quarters: quarters, |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
message.success(`成功创建 ${checkedItems.length} 个季度的空白报表`); |
|
|
|
|
|
quarterModalVisible.value = false; |
|
|
|
|
|
queryData(); |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
smartSentry.captureError(e); |
|
|
|
|
|
} finally { |
|
|
|
|
|
SmartLoading.hide(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ---------------------------- 单个提交 ---------------------------- |
|
|
// ---------------------------- 单个提交 ---------------------------- |
|
|
//确认提交 |
|
|
//确认提交 |
|
|
function onSubmit(data){ |
|
|
function onSubmit(data){ |
|
|
@ -332,8 +397,6 @@ |
|
|
|
|
|
|
|
|
//请求提交 |
|
|
//请求提交 |
|
|
async function requestSubmit(data){ |
|
|
async function requestSubmit(data){ |
|
|
// 检查权限,确保只能提交未提交数据 |
|
|
|
|
|
// 行政账号(staff)和主任账号(cto)可以相互操作对方的数据 |
|
|
|
|
|
if (data.approvalStatus !== 0) { |
|
|
if (data.approvalStatus !== 0) { |
|
|
message.warning('只能提交未提交状态的数据'); |
|
|
message.warning('只能提交未提交状态的数据'); |
|
|
return; |
|
|
return; |
|
|
@ -341,7 +404,32 @@ |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
SmartLoading.show(); |
|
|
SmartLoading.show(); |
|
|
// 后端接口要求传递idList参数,这里传递单个ID的数组 |
|
|
|
|
|
|
|
|
const checkResult = await firmReportsApi.preCommitCheck([data.id]); |
|
|
|
|
|
if (checkResult.data && checkResult.data.hasMissing) { |
|
|
|
|
|
SmartLoading.hide(); |
|
|
|
|
|
const missingQuarters = checkResult.data.missingQuarters || []; |
|
|
|
|
|
const firmId = checkResult.data.firmId; |
|
|
|
|
|
const year = checkResult.data.year; |
|
|
|
|
|
const currentQuarter = checkResult.data.currentQuarter; |
|
|
|
|
|
|
|
|
|
|
|
quarterYear.value = year; |
|
|
|
|
|
quarterCurrentQuarter.value = currentQuarter; |
|
|
|
|
|
quarterFirmId.value = firmId; |
|
|
|
|
|
quarterMissingList.value = missingQuarters.map((q) => { |
|
|
|
|
|
const parsed = parseQuarterLabel(q); |
|
|
|
|
|
return { |
|
|
|
|
|
label: q, |
|
|
|
|
|
checked: true, |
|
|
|
|
|
year: parsed.year, |
|
|
|
|
|
quarterNum: parsed.quarterNum, |
|
|
|
|
|
}; |
|
|
|
|
|
}); |
|
|
|
|
|
pendingSubmitRecord.value = data; |
|
|
|
|
|
quarterModalVisible.value = true; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
await firmReportsApi.commit([data.id]); |
|
|
await firmReportsApi.commit([data.id]); |
|
|
message.success('提交成功'); |
|
|
message.success('提交成功'); |
|
|
queryData(); |
|
|
queryData(); |
|
|
@ -352,6 +440,11 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function parseQuarterLabel(label) { |
|
|
|
|
|
const match = label.match(/(\d+)年第(\d+)季度/); |
|
|
|
|
|
return match ? { year: parseInt(match[1]), quarterNum: parseInt(match[2]) } : null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ---------------------------- 驳回相关 ---------------------------- |
|
|
// ---------------------------- 驳回相关 ---------------------------- |
|
|
|
|
|
|
|
|
// 确认驳回 |
|
|
// 确认驳回 |
|
|
|