EX:Sort

1.Bubble Sort (3)

1.1

#include <stdio.h>

int main(void) {
	int nums[4] = {1,5,3,2};
	//caculate the size of array
	size_t size = sizeof(nums) / sizeof(nums[0]);
	for (int i = 1; i < size; i++) {
		for (int j = 0; j < size - i; j++) {
			if (nums[j + 1] < nums[j]) {
			//exchange the values by adding an empty container
				int temp = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = temp;
			}
		}
	}
	printf("bubble sorted nums[4] = {");
	for (int k = 0; k < size; k++) {
		printf("%d",nums[k]);
		if (k != 3) {
			printf(",");
		}
	}
	printf("}\n");
	return 0;
}

output:

bubble sorted nums[4] = {1,2,3,5}

1.2 reversed

#include <stdio.h>

int main(void) {
	int nums[4] = {1,5,3,2};
	size_t size = sizeof(nums) / sizeof(nums[0]);
	for (int i = 1; i < size; i++) {
		for (int j = 3; j > i - 1; j--) {
			if (nums[j] > nums[j - 1]) {
			//exchange the values by adding an empty container
				int temp = nums[j];
				nums[j] = nums[j - 1];
				nums[j - 1] = temp;
			}
		}
	}
	printf("Reversed bubble sorted nums[4] = {");
	for (int k = 0; k < size; k++) {
		printf("%d",nums[k]);
		if (k != size - 1) {
			printf(",");
		}
	}
	printf("}\n");
	return 0;
}

output:

Reversed bubble sorted nums[4] = {5,3,2,1}

1.3

#include <stdio.h>

int main(void) {
	int nums[] = { 1,5,3,2 };
	//caculate the size of array
	size_t size = sizeof(nums) / sizeof(nums[0]);
	for (int i = 1; i < size; i++) {
		for (int j = 0; j < size - i; j++) {
			if (nums[j + 1] > nums[j]) {
			//exchange the values by adding an empty container
				int temp = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = temp;
			}
		}	
	}
	printf("2Reversed bubble Sorted nums[4] = {");
	for (int k = 0; k < size; k++) {
		printf("%d",nums[k]);
		if (k != size - 1) {
			printf(",");
		}
	}
	printf("}\n");
	return 0;
}

output:

2Reversed bubble Sorted nums[4] = {5,3,2,1}

2.Select Sort(3)

2.1 思路很像

#include <stdio.h>
int main(void) {
	int nums[4] = {1,5,3,2};
	int* pzero = nums;//default:the ptr to nums[0]
	size_t size = sizeof(nums) / sizeof(nums[0]);//caculate the array
	for (int i = 1; i < size; i++) {
		if (nums[i] > *pzero) {
		//exchange values by adding a  empty container 
			int temp = *pzero;//save the original value of nums[0]
			*pzero = nums[i];
			nums[i] = temp;//the original nums[0]
		}
	
	}
	for (int j = 2; j < size; j++) {
		if (nums[j] > *(pzero + 1)) {
		//exchange values by adding a empty container
			int temp2 = *(pzero + 1);
			*(pzero + 1) = nums[j];
			nums[j] = temp2;
		}
	
	}
	for (int k = 3; k < size; k++) {
		if (nums[k] > *(pzero + 2)) {
		//exchange values by adding a empty container
			int temp3 = *(pzero + 2);
			*(pzero + 2) = nums[k];
			nums[k] = temp3;
		}
	}
	printf("nums[4] = {");
	for (int d = 0; d < size; d++) {
		printf("%d",nums[d]);
		if (d != size - 1) {
			printf(",");
		}
	}
	printf("}\n");

	return 0;
}

output:

nums[4] = {5,3,2,1}

2.2 改

#include <stdio.h>

int main(void) {
	int nums[4] = {1, 5, 3, 2};
	int* pzero = nums;  // ptr to nums[0]
	size_t size = sizeof(nums) / sizeof(nums[0]);  // calculate array size

	// loop through each position to place the correct element
	for (int i = 0; i < size - 1; i++) {
		for (int j = i + 1; j < size; j++) {
			if (nums[j] > *(pzero + i)) {
				// swap values using an empty container
				int temp = *(pzero + i);
				*(pzero + i) = nums[j];
				nums[j] = temp;
			}
		}
	}

	// output the sorted array
	printf("Sorted nums[4] = {");
	for (int d = 0; d < size; d++) {
		printf("%d", nums[d]);
		if (d != size - 1) {
			printf(",");
		}
	}
	printf("}\n");

	return 0;
}

output:

Sorted nums[4] = {5,3,2,1}

2.3 minIndex

#include <stdio.h>

	int main(void) {
		int nums[4] = { 1,5,3,2 };
		size_t size = sizeof(nums) / sizeof(nums[0]);

		for (int i = 0; i < size - 1; i++) {
			//set the minindex []
			int min = i;
			for (int j = i + 1; j < size; j++) {
				if (nums[j] < nums[min]) {
					min = j;
				}
			
			}
			//exchange current value with the min value
			if (min != i) {
				int temp = nums[i];
				//exchange the values
				nums[i] = nums[min];
				nums[min] = temp;
			}
		
		}
		printf(" Sorted nums[4] = {");
		for (int k = 0; k < size; k++) {
			printf("%d", nums[k]);
			if (k != size - 1) {
				printf(",");
			}
		}
		printf("}");
	
	}

output:

 Sorted nums[4] = {1,2,3,5}

3.错误写法

当nums[4] ={ 1,5,3,2}时,排序正常,错误不明显,再增加数字之后:

#include <stdio.h>
int main(void) {
	int nums[7] = { 1,5,3,2,10,11,12};
	int* pzero = nums;//default: the ptr to nums[0]
	size_t size = sizeof(nums) / sizeof(nums[0]);
	for (int i = 1; i < size; i++) {
		for (int j = i - 1; j < size - 1; j++) {
			if (nums[j + 1] > *(pzero + j)) {
				//exchange the values by adding a empty comtainer
				int temp = *(pzero + j);
				*(pzero + j) = nums[j + 1];
				nums[j + 1] = temp;
			}
		}
	}
	printf("nums[7] = {");
	for (int k = 0; k < size; k++) {
		printf("%d", nums[k]);
		if (k != size - 1) {
			printf(",");
		}
	}
	printf("}");
	return 0;
}

output:

nums[7] = {5,3,11,12,10,2,1}

分析:
1.只比较了静态小区间里的最大值,而不是全局的最大值
2.内循环的起始值不合理
3.未排序和排序的部分界限不明,或者说根本没有全局排序,只是部分排序

4.总结

综上:排序只是一种思想,没有固定的写法,写法也只是实现思想的工具。

按照以下生成帮助说明系统界面说明文档规范 一、目的: 软件系统界面帮助说明是用户与系统之间重要的沟通桥梁,帮助用户快速了解该菜单的功能以及数据来源、数据逻辑,后续可自行操作或者核查信息。 二、编制和适用范围: e-ONE一体化系统全部界面菜单 三、定义和分类: 由于系统界面菜单主要分操作及查询两大类,界面帮助说明相应进行标准化。 四、职责和更新要求: 界面帮助说明由开发人员按要求整理,发布流程时上传Word文档,正式库发布24小时更新到正式库界面帮助说明中。 五 操作类界面文档内容: 1、 菜单总体功能描述。 Ex: 按项目、材质进行各工序周期统计,求平均数。 2、按钮功能。 每个按钮功能及对应的角色 Ex:预制地设置按钮:选中小票设置小票的预制地,根据设置的预制地进行排产派工,该按钮对应的角色是管-内场角色 Ex:导入按钮:导入该菜单中的材质和厂家日期信息,同时日期格式必须是日日-月月-年年) 有的功能当前只是适用某个基地或者项目或者特殊业务场景等,都要进行说明。 3、字段说明。(除常规字段例如:项目、基地、车间、班组、姓名、工号、图纸号、图纸名、备注等,其他字段都需说明) 说明每个字段含义、数据来源、相关计算逻辑(如果数据有定时任务,请标明定时任务的名称、时间点以及是否有手动刷新的按钮) Ex:小票号:小票的标识,项目号+小票号+版本确定唯一一条数据。 小票版本:从0版开始,图纸修改会升级版本,版本连续增长,由技术做升版操作 如定时任务同步,标明执行时间与任务名称。 Ex:数据来源于技术和导入操作,每天凌晨一点,技术推送数据。 4、与此菜单关联的基础配置信息。 Ex: MES基地配置(配置后的项目及基地才能进行MES作业下达) 5、更新日志与版本说明 更新日志:统一放到系统更新日志里,在帮助页面放更新日志编号,附加链接即可 版本说明:针对有特殊浏览器版本需求的菜单,提供详细的版本说明和兼容性信息,该菜单需要使用谷歌100以上版本等 Ex:20240329:新增作业区字段(需求提出人:王跳跳;需求负责人: 王建国;开发人员: 王富贵);。 Ex:20240320:新增属地展示。(需求提出人:王跳跳;需求负责人: 王建国;开发人员: 王富贵) 6、负责人及开发人员。 遇到问题方便查找相关人。 Ex: (需求负责人: 王翠花 开发人员: 王富贵) 如果当前需求或者开发人员和前期不一致,请一起写上 1、 报表看板查询类文档内容: 1、报表或者看板总体功能介绍。 Ex: 按项目、材质进行各工序周期统计,求平均数。数据为实时查询。 2、报表适用的场景和范围以及适用角色。 该看板或者报表给哪个场景或者角色使用,方便后期权限维护。 Ex:项目计划员角色需要查询该报表或者该报表当前只是烟台基地开放使用等 3、界面布局: 如果该报表或者看板比较复杂,需要介绍报表界面布局包括上方工具栏、左面板、报表内容区域、分页等信息 4、字段说明。(除常规字段例如:项目、基地、车间、班组、姓名、工号、图纸号、图纸名、备注等,其他字段都需说明) 说明每个字段含义、数据来源、相关计算逻辑(如果数据有定时任务,请标明定时任务的名称、时间点以及手动刷新的按钮) Ex:小票号:小票的标识,项目号+小票号+版本确定唯一一条数据。 小票版本:从0版开始,图纸修改会升级版本,版本连续增长,由技术做升版操作 如定时任务同步,标明执行时间与任务名称。 Ex:数据来源于技术和导入操作,每天凌晨一点,技术推送数据。 5、更新日志与版本说明 更新日志:统一放到系统更新日志里,在帮助页面放更新日志编号,附加链接即可 版本说明:针对有特殊浏览器版本需求的菜单,提供详细的版本说明和兼容性信息,该菜单需要使用谷歌100以上版本等。 Ex:20240329:新增作业区字段(需求提出人:王跳跳;需求负责人: 王建国;开发人员: 王富贵);。 Ex:20240320:新增属地展示。(需求提出人:王跳跳;需求负责人: 王建国;开发人员: 王富贵) 6、负责人及开发人员。 遇到问题方便查找相关人。 Ex: (需求负责人: 王翠花 开发人员: 王富贵) 帮助说明更新时间:2025-01-01 标准模版: 一、菜单总体功能描述 [菜单总体功能描述内容] 二、按钮功能 按钮名称 功能描述 对应角色 按钮1名称 按钮1功能描述 按钮1对应角色 三、字段说明 字段名称 含义 数据来源 计算逻辑 字段1名称 字段1含义 字段1数据来源 字段1计算逻辑 四、关联的基础配置信息 关联基础配置信息列表项,每项一个说明,如: 五、更新日志与版本说明 版本说明 [版本说明内容,如浏览器兼容性等] 更新日志 [更新日志行数据,每行一个标签包裹,如: ] 版本 更新说明 业务对接人 需求负责人 开发人员 更新日期 V1 初始版本上线,[具体功能描述] [业务需求对接人姓名-IC卡号] [需求负责人姓名] [开发人员姓名] [更新日期V1] 六、负责人及开发人员  需求负责人:[具体需求负责人姓名]  开发人员:[具体开发人员姓名] (若当前需求/开发人员与前期不一致,补充说明:前期需求负责人为[前期姓名]、开发人员为[前期姓名],当前迭代由[现姓名]负责) 样例: 代码为<!-- 周报文件 --> <template> <div> <!-- 顶部筛选条件 --> <c-search-panel :columns="columns.concat(extraColumns)" @search="search" ref="searchForm"> <template slot="projectNo"> <v-project-select mode="multiple" maxSelect="2" style="width: 174px" v-decorator="[ 'projectId', { rules: [ { required: true, message: $t('pipeControll.common.selectProjectNumber'), }, ], }, ]" /> </template> <template slot="cutOffDate"> <a-range-picker @change="cutOffDateChange" v-model="cutOffDate" /> </template> </c-search-panel> <v-table filled :dataSource="this.dataList" :columns="columns" :pagination="pagination" :toolbar="toolbar" @toolbar-button-click="onToolbarClick" :proxy-config="proxyConfig" :sort-congfig="sortConfig" ref="vtable" :loading="$store.state.spinning" :empty-text="empty" > <template #action="{ record }"> <a @click="upload(record,'monthlyReport')" type="primary" v-resource="[{ url: '/service-product/monthlyReport/upload/monthlyReport', method: 'POST' }]" >上传周报</a> <a-divider type="vertical" /> <a @click="upload(record,'attachment')" type="primary" v-resource="[{ url: '/service-product/monthlyReport/upload/attachment', method: 'POST' }]">上传附件</a> <a-divider v-if="record.monthlyFileId" type="vertical" /> <a @click="download(record,'monthlyReport')" v-if="record.monthlyFileId" type="primary" v-resource="[{ url: '/service-product/monthlyReport/download/monthlyReport', method: 'GET' }]">download monthly report</a> <a-divider v-if="record.attachmentFileId" type="vertical" /> <a @click="download(record,'attachment')" v-if="record.attachmentFileId" type="primary" v-resource="[{ url: '/service-product/monthlyReport/download/attachment', method: 'GET' }]">download attachment</a> </template> <template #projectNo="{ record }"> <div>{{ record.projectName }}</div> </template> </v-table> <a-modal :visible="fileVisible" @ok="fileModalOk" @cancel="fileModalCancel" :footer="null" :title="this.type == 'monthlyReport'?'上传周报':'上传附件'" okText="确认" width="700px" > <a-row> <a-upload :file-list="uploadList" :remove="handleRemove" :before-upload="beforeUpload" list-type="text" @change="handleUpload" :multiple="false" > <a-button> <a-icon type="upload" />{{ $t('上传文件') }} </a-button> </a-upload> </a-row> </a-modal> </div> </template> <script> import { fileSaver } from "@/utils"; import * as Serve from "~api/modules/board/p80/monthlyReport/monthlyReport"; import moment from "moment"; import * as vsServe from "~api/modules/board/H609/visitsStatistics"; export default { data() { return { empty:this.$t("noData.default"), id:'', type:'', fileVisible:false, uploadList: [], cutOffDate: ['', ''], columns: [ { type: "checkbox", width: 50 }, { dataIndex: "projectId", title: "Project", type: "project", width: 200, condition: true, align: "center", scopedSlots: { customRender: "projectNo" }, }, { title: "Serial No.", align: "center", condition: true, dataIndex: "serialNo", width: 100, }, { title: "Month", align: "center", condition: true, dataIndex: "month", width: 100, }, { title: "Cutoff Date", align: "center", dataIndex: "cutoffDate", width: 120, }, { title: "Monthly Report", align: "center", dataIndex: "monthlyReport", width: 300, }, { title: "Attachments", align: "center", dataIndex: "attachments", width: 250, }, { //title: "操作", title: this.$t("column.operation"), key: "action", sortable: false, align: "center", width: 350, scopedSlots: { customRender: "action" }, }, ], extraColumns: [ { title: "Cutoff Date", visible: false, condition: true, scopedSlots: { customRender: "cutOffDate", }, }, ], toolbar: { buttons: [ { code: "imp", name: "import", resource: [ { url: "/service-product/cd/monthly/report/importDatas", method: "POST", }, ], }, { code: "exp", name: "export", resource: [{ url: "/service-product/cd/monthly/report/export", method: "GET" }], }, ], }, pagination: { total: 0, }, dataList: [], sortConfig: { default: "id", sort: "desc" }, proxyConfig: { autoLoad:false, ajax: { query: ({ page, sort, filters }, ...args) => { if(this.conditionData == undefined){ this.conditionData = {}; } let cutOffStartDate = ""; let cutOffEndDate = ""; if ( this.cutOffDate.length == 2 && this.cutOffDate[0] != "" && this.cutOffDate[0] != null && this.cutOffDate[1] != "" && this.cutOffDate[1] != null ) { cutOffStartDate = moment(this.cutOffDate[0]).format("YYYY/MM/DD"); cutOffEndDate = moment(this.cutOffDate[1]).format("YYYY/MM/DD"); } if (cutOffStartDate != "" && cutOffStartDate != null ) { this.$set(this.conditionData, "cutOffStartDate", cutOffStartDate); } if (cutOffEndDate != "" && cutOffEndDate != null) { this.$set(this.conditionData, "cutOffEndDate", cutOffEndDate); } vsServe.save([{projectId:2902,pathName:window.sessionStorage.getItem("currMenuId")}]); let data = Serve.page({ ...this.conditionData, ...this.$vtable.pagination(page), }); data.then(res=>{ if (res.data.content.length==0) { this.empty=this.$t("noData.notAvailableData") } }) return data }, }, }, }; }, beforeCreate() { this.searchForm = this.$form.createForm(this); }, computed: { table() { return this.$refs.vtable.getTable(); }, form() { return this.$refs.searchForm.getForm(); }, }, mounted() { }, methods: { onToolbarClick(target) { switch (target.code) { case "imp": this.importData(); break; case "exp": this.exp(); break; default: break; } }, fileModalCancel() { this.fileVisible = false; this.id = ''; this.type = ''; this.uploadList=[]; }, fileModalOk() { this.fileVisible = false; this.id = ''; this.type = ''; this.uploadList=[]; }, // 查询 search(values) { if (values.projectId) { values.projectIds = values.projectId.join(","); delete values.projectId; } this.conditionData = values; this.table.commitProxy("reload", { page: 0 }); }, // 选择截止日期 cutOffDateChange(date, dateString) { this.cutOffDate = date; }, // 移除列表中文件 handleRemove(file) { const index = this.uploadList.indexOf(file) const newFileList = this.uploadList.slice() newFileList.splice(index, 1) this.uploadList = newFileList }, // 文件上传前处理 beforeUpload(file) { this.uploadList = [...this.uploadList, file] return false }, getPromiseArray(uploadList) { let promiseArr = [] uploadList.forEach((file) => { const promiseItem = this.$store.dispatch( 'MaintenanceRespPlan/upload', file ) promiseArr.push(promiseItem) }) return promiseArr }, handleUpload() { const { uploadList } = this Promise.all(this.getPromiseArray(uploadList)) .then((response) => { console.log('response',response); if(response && response[0].data) { let values = []; if(this.type =='monthlyReport') { values.push({id:this.id,monthlyFileName:response[0].data.name,monthlyFileId:response[0].data.id}); } else { values.push({id:this.id,attachmentFileName:response[0].data.name,attachmentFileId:response[0].data.id}); } Serve.save(values).then((res) => { if (!res.error) { this.$message.success('上传成功!') this.fileModalCancel(); this.table.commitProxy('reload', { page: 0 }) } }) } }) .catch(({ response }) => { this.$message.error(this.$t('maintenance.common.uploadFailed')) }) }, upload(record,type) { this.fileVisible = true; this.id = record.id; this.type = type; }, //预览下载 download(record,type) { let fid = ''; let fname = ''; if(type == 'monthlyReport') { fid = record.monthlyFileId; fname = record.monthlyFileName; } else { fid = record.attachmentFileId; fname = record.attachmentFileName; } Serve.downloadFile(fid).then(msg => { if (!msg.error) { fileSaver.saveAs(msg.data, fname); } }); }, importData() { this.table.readFile({ types: ["xlsx", "xls"] }).then(response => { const { files } = response; if (files.length < 1) return; let params = { file: files[0] }; Serve.imp(params).then(response => { if (response.data.size > 0) { this.$message.error("上传失败,请查看错误文件"); fileSaver.saveAs(response.data, "导入提示.xlsx"); } else { this.$message.success(this.$t("pipeControll.common.uploadSuccess")); this.table.commitProxy("query"); } }); }); }, exp() { this.form.validateFields((err, values) => { if (values.projectId) { values.projectIds = values.projectId.join(","); delete values.projectId; } if (!err) { vsServe.save([{projectId:2902,pathName:window.sessionStorage.getItem("currMenuId")}]); Serve.exp(values).then(({ data }) => { this.$notification.open({ duration: 0, message: "导出内容准备中....", description:this.$t('assemblybasic.structure.exportstructuretips'), icon: <a-icon type="check-circle" theme="twoTone" twoToneColor="#52c41a" />, }); }); } }); }, }, }; </script>
11-05
普通文本型问题,直接回答如下: ```markdown # e-ONE一体化系统界面帮助说明文档规范 ## 一、目的 软件系统界面帮助说明是用户与系统之间的重要沟通桥梁,旨在帮助用户快速理解菜单功能、数据来源及逻辑,支持用户自主操作与信息核查。 ## 二、编制和适用范围 适用于 **e-ONE一体化系统** 的所有界面菜单,包括操作类与查询类(报表/看板)菜单。 ## 三、定义和分类 系统界面菜单分为两大类: 1. **操作类菜单**:涉及数据录入、修改、导入、导出、状态变更等交互功能。 2. **查询类菜单(报表/看板)**:以数据展示为主,供分析、监控使用。 相应地,帮助说明文档按此分类进行标准化编写。 ## 四、职责和更新要求 - **开发人员**负责按规范整理并提交帮助说明文档(Word格式)。 - 在发布流程中随需求一同上传文档。 - 正式环境发布后 **24小时内**,将文档内容同步至系统界面的帮助模块中。 - 文档需保持最新,确保与系统实际功能一致。 --- ## 五、操作类界面文档内容模板 ### 一、菜单总体功能描述 [简要描述该菜单的核心业务目标和主要功能] 示例:按项目、材质统计各工序周期,并计算平均值。 ### 二、按钮功能 | 按钮名称 | 功能描述 | 对应角色 | |--------|--------|--------| | 预制地设置 | 选中小票后设置其预制地,用于后续排产派工 | 管-内场角色 | | 导入 | 批量导入材质与厂家日期信息,日期格式必须为 `日日-月月-年年` | 所有可编辑角色 | > 注:若功能仅适用于特定基地、项目或场景,需在此明确说明。 ### 三、字段说明 | 字段名称 | 含义 | 数据来源 | 计算逻辑 | |--------|------|----------|----------| | 小票号 | 唯一标识小票,由“项目号+小票号+版本”确定唯一性 | 技术系统推送 + 用户导入 | 实时生成,主键约束 | | 小票版本 | 图纸版本标识,从0开始递增 | 技术系统升版操作触发 | 每次图纸变更自动+1 | | cutoffDate | 截止日期范围筛选条件 | 用户手动选择 | 支持区间选择,前端传参控制 | > 若字段数据依赖定时任务,请注明: > - 定时任务名称:`JOB_SYNC_TECH_DATA` > - 执行时间:每日凌晨1:00 > - 是否支持手动刷新:是(点击【刷新】按钮) ### 四、关联的基础配置信息 列出影响当前菜单正常使用的前置配置项: - **MES基地配置**:只有在系统中配置过的项目与基地,才能执行MES作业下达。 - **角色权限配置**:需分配对应资源权限方可看到或操作按钮。 - **文件存储服务配置**:附件上传依赖OSS服务连接正常。 ### 五、更新日志与版本说明 #### 版本说明 - 推荐浏览器:Google Chrome ≥ v100 - 不兼容IE浏览器,建议使用现代浏览器访问 - 移动端适配:暂不支持移动端操作 #### 更新日志 | 版本 | 更新说明 | 业务对接人 | 需求负责人 | 开发人员 | 更新日期 | |------|---------|------------|-------------|-----------|-----------| | V1 | 初始版本上线,实现周报上传下载功能 | 王跳跳-Z00123 | 王建国 | 王富贵 | 2024-03-20 | | V2 | 新增作业区字段展示 | 王跳跳-Z00123 | 王建国 | 王富贵 | 2024-03-29 | > 更多历史更新请查看:[系统更新日志](https://intranet.example.com/logs) ### 六、负责人及开发人员 - **需求负责人**:王翠花 - **开发人员**:王富贵 > (补充说明:前期需求负责人为王建国,开发人员为王富贵;当前迭代由王翠花统筹) --- ## 六、报表看板查询类文档内容模板 ### 一、报表或看板总体功能介绍 [概述报表的核心统计逻辑与用途] 示例:按项目、材质对各工序周期进行统计,求取平均处理周期,数据为实时查询结果。 ### 二、报表适用的场景和范围以及适用角色 说明使用对象和限制条件: - **适用角色**:项目计划员、生产调度员 - **使用场景**:生产进度跟踪、跨项目对比分析 - **开放范围**:目前仅限烟台基地使用 - **权限控制方式**:基于RBAC模型控制菜单可见性 ### 三、界面布局 对于复杂看板,应描述整体结构: - **顶部工具栏**:包含项目多选框、截止日期范围选择器等筛选控件 - **左侧面板**:可折叠的维度树状导航(如车间 → 工序) - **中间内容区**:表格形式展示数据,支持排序与分页 - **底部页脚**:显示总条数与当前页码(每页默认20条) ### 四、字段说明 | 字段名称 | 含义 | 数据来源 | 计算逻辑 | |--------|------|----------|----------| | Serial No. | 序列编号,标识每条记录 | 自动生成流水号 | 自增规则由数据库序列控制 | | Month | 统计月份 | 用户输入或默认当前月 | 格式标准化为 `YYYY-MM` | | Monthly Report | 周报文件链接 | 用户上传至文件服务器 | 显示文件名,支持下载 | | Attachments | 补充附件列表 | 同上 | 多文件支持,最多上传5个 | > 数据同步机制说明: > - 数据来源:技术系统接口 + 用户导入操作 > - 同步频率:每天凌晨1:00执行定时任务 `JOB_DAILY_REPORT_SYNC` > - 手动刷新:提供【刷新】按钮,可立即获取最新数据 ### 五、更新日显与版本说明 #### 版本说明 同操作类菜单要求,若有特殊客户端依赖也需注明。 #### 更新日志 | 版本 | 更新说明 | 业务对接人 | 需求负责人 | 开发人员 | 更新日期 | |------|---------|------------|-------------|-----------|-----------| | V1 | 初始版本上线,支持月报上传与下载 | 李晓峰-Z00234 | 张伟 | 刘洋 | 2024-01-15 | | V2 | 新增属地字段展示 | 李晓峰-Z00234 | 张伟 | 刘洋 | 2024-02-10 | > 查看完整更新记录:[系统更新日志](https://intranet.example.com/logs) ### 六、负责人及开发人员 - **需求负责人**:张伟 - **开发人员**:刘洋 > (补充说明:前期开发团队为旧版维护组,本次重构由刘洋主导完成) --- ## 七、通用编写要求 1. **语言风格**:简洁明了,避免专业术语堆砌,必要时提供通俗解释。 2. **格式统一**:使用标准Markdown或Word模板,表格对齐清晰。 3. **字段说明优先级**:除常规字段外,其余均需详细说明含义、来源与计算方式。 4. **更新及时性**:每次功能迭代后必须同步更新帮助文档。 5. **责任人透明化**:确保每个版本都有明确的责任归属,便于问题追溯。 > **帮助说明最后更新时间**:2025-01-01 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值